Daha önce başlatılmış bir işlemi hiçbir şeyden / ekrandan görüntüleyebilir miyim?


260

SSH üzerinden uzun süredir çalışan veri taşıma komut dosyalarının bazı test çalışmalarını yapıyorum. Diyelim ki saat 4 civarında bir senaryoyu çalıştırmaya başladım; Şimdi, 6 PM etrafta dolaşıyor ve bunu yapamadığım için kendime küfrediyorum screen.

nohupBir işlemi "geriye dönük olarak" uygulamak için herhangi bir yol var mı , yoksa bilgisayarımdan tüm gece çevrimiçi kalmam gerekir mi? O eklemek mümkün değilse screen/ için nohupneden o zaman, ben önce başlamış olduğunuz bir süreç? Ebeveyn / çocuk sürecinin nasıl etkileşimde bulunduğuyla ilgili bir şey mi var? (En azından 'neden' sorusunu ele almayan bir "hayır" yanıtını kabul etmiyorum - üzgünüm;)


4
Hakkında ilginç bir blog yazısı gördüm disown. blogs.oracle.com/ksplice/entry/disown_zombie_children_and_the
saat 17:11

Yanıtlar:


212

Bash kullanıyorsanız, koşabilirsiniz disown -h job

sahip çıkmamak

disown [-ar] [-h] [jobspec ...]

Seçenekler olmadan, her iş alanı etkin iş tablosundan kaldırılır. Eğer -hseçenek verilmiş iş tablodan kaldırılmaz, ancak kabuk bir SIGHUP alırsa o SIGHUP iş gönderilmez böylece işaretlenir. Jobspec yoksa ve ne ne -ade -rseçeneği sağlanmıyorsa, geçerli iş kullanılır. Hiçbir iş belirtilmezse, -a seçenek tüm işleri kaldırmak veya işaretlemek anlamına gelir; -rBir jobspec argüman olmadan seçenek işleri çalıştırma için operasyon kısıtlar.


müthiş; Bunun gibi bir şeyin olacağını umuyordum.
ojrac

7
Hayat adaletsiz olabilir. gharper ve ben bunu aynı anda
gönderiyorduk

4
Sen benim kahramanımsın
Thomas Dignan

9
uzaklaştırma bash'a özgü değildir. Ayrıca, zsh, ksh93, ...
Phil P

2
Aslında disown %1fg ya da bg'den farklı olarak 1'in işlenen ise aslında bg 1 serverwatch.com/tutorials/article.php/3935306/…
mltsy

81

Reptyr kullan

README'den:

reptyr - A tool for "re-ptying" programs.
-----------------------------------------

reptyr is a utility for taking an existing running program and
attaching it to a new terminal. Started a long-running process over
ssh, but have to leave and don't want to interrupt it? Just start a
screen, use reptyr to grab it, and then kill the ssh session and head
on home.

USAGE
-----

  reptyr PID

"reptyr PID" will grab the process with id PID and attach it to your
current terminal.

After attaching, the process will take input from and write output to
the new terminal, including ^C and ^Z. (Unfortunately, if you
background it, you will still have to run "bg" or "fg" in the old
terminal. This is likely impossible to fix in a reasonable way without
patching your shell.)

Yazarın yazdığı birkaç blog yazısı:


Yerleşik aletlerle (yani disown) takılacağım, ancak reptyr kadar esnek değil. +1
ojrac


16

Bir işlem başladığında, STDIN, STDOUT ve STDERR bir şeye bağlanır . Genellikle komut başlatıldığında bunu değiştiremezsiniz. Tarif ettiğiniz durumda, muhtemelen ssh oturumu ile ilgili bir tty. Nohup hemen hemen sadece ...

command < /dev/null > nohup.out 2>&1

Yani, STDIN'i / dev / null, STDOUT'u bir dosyaya ve STDERR'yi STDOUT'a ayarlar. Ekran kendine yönelten tty'ler ayarlamayı içeren çok daha karmaşık şeyler yapar.

Çalışan bir işlemi geriye dönük olarak nohuping veya ekranlama yöntemlerini bilmiyorum. Eğer / proc / $ pid / fd ile cd yaparsanız ve 0, 1 ve 2'nin ne anlama geldiğini görün.

Hürmeten biraz şans olabilir, ancak eğer süreç STDIN, STDOUT veya STDERR ile bir şeyler yapmaya çalışırsa değil.


2
İyi yorumlarınız için +1. st (din | out | err) sorunun diğer yarısıdır ve bir dahaki sefere bu reçelde bakmaya nereden başlayacağınız konusundaki tavsiyelerini takdir ediyorum.
ojrac

6
Aslında çoğu Unix'te değiştirebilirsiniz. Bu iğrenç bir kesmek. Onu seviyorum. :) Yapmanız gereken, ptrace gibi hata ayıklama desteğini kullanarak işleme bağlanın, ardından işlemi 0,1,2'yi başka bir dosya askısına yeniden bağlamak için dup2 () öğesini çağırmaya zorlayın.
Zan Lynx,

2
evet, değiştirebilirsiniz. Süreci duraklatmayı (SIGSTOP) ve fd 0, 1, 2 için dosya tanımlayıcılarını değiştirmeyi içerir. Sonra yeniden başlatılır (SIGCONT).
Michael Martinez,

13

Kriyopid , bir işlemi bir dosyaya donduran grab.c'nin yazarından, daha sonra işlemi devam ettirmek için (ekran içinde) çalıştırdığınız bir gelişmedir.


1
Güzel! Kriyopidi ustamın işlem göçü konusundaki tezinde kullanmaya çalıştım, fakat ne yaparsam yapayım her zaman işe yaramadı. Sonunda, eski bir Linux sürümüyle dynckpt kullanmak zorunda kaldım. Kriyopid gelişiminde belki yer alıyor musunuz? Adınızın, yazarın etki alanına benzer olduğunu görüyorum.
Juliano

1
Gelişmeye dahil değilim, sadece üniversiteden yazarı tanıyorum. Şu anda kriyopiyi sürdürecek zamanı yok, bu yüzden bazı insanlar üzerinde çalışmaya başlamış gibi göründüğü gibi, shareource.org/project/cryopid
TRS-80

12

Size sadece basit bir "Hayır" diyebilirim, çünkü ekran bölümünün nedenini bilsem de kendime.

Ancak denediniz mi disown(bir bash yerleşik)

~ $ echo $SHELL
/bin/bash
~ $ type disown
disown is a shell builtin
~ $ help disown
disown: disown [-h] [-ar] [jobspec ...]
     By default, removes each JOBSPEC argument from the table of active jobs.
    If the -h option is given, the job is not removed from the table, but is
    marked so that SIGHUP is not sent to the job if the shell receives a
    SIGHUP.  The -a option, when JOBSPEC is not supplied, means to remove all
    jobs from the job table; the -r option means to remove only running jobs.


5

Geçenlerde libcaca kullanılarak inşa edilmiş, renkli bir sanat eseri kütüphanesi olan ekrana benzeyen bir yardımcı program olan neerc'lere bir bağlantı gördüm . Diğer özelliklerin yanı sıra, mevcut bir süreci kapma ve neercs (ekran) oturumunuzda yeniden üst üste yerleştirme yeteneğine sahiptir.

Ancak ben kullanmadım, bu yüzden çalışıp çalışmadığını yorumlayamıyorum.


2

Muhtemelen bunun altında olduğumu düşünüyordum, bu yüzden beni düzeltmekte özgürsünüz (şimdiye dek hayal kırıklığı hakkında öğrendim!) ... Bir ctrl-Z ve "bg" en azından arka planda çalışan süreci elde etmek için çalışmaz mı? Yoksa STDOUT'u çalışırken hala görmek isteyeceğiniz temel mesele mi?


1
Sahip tty yüzden OP o kaçınmak istediği budur komut çalışan, intiated nerede kutusunu bırakmak gerekiyor öldüğünde Hala süreci öldürür
serverhorror

Tamam, onu alacağım. Açıklama için teşekkürler. Öyleyse, küçümseme -h önerileri benimkinden çok daha akıllı görünüyor :-)
Chris_K

1
Bunu hala yapabilirsin, hemen sonra -h: stackoverflow.com/a/625436/705198
AndrewPK

2

İşlemle etkileşime girememekle yaşayabilir ve rastgele çekirdek modülleri yüklemeye itiraz edemiyorsanız, Snoop'a bakmaktan daha kötüsünü yapabilirsiniz . Alternatif olarak, birkaç başka proje var. İşte yapmak istediğin şeyi yapabilecek tek bir arama kodu.



1

Komut satırı tarayıcısını nohupbaşlatmak için (veya benzerini) kullanmak istedim linksve ASP.NET web sitesinden bir dosyayı indirdikten sonra karmaşık kimlik doğrulama işlemi ve kullanımı zorlaştıran birçok gizli görünüm durumu ile eklemek istedim. ile curl/ ' wget.

Sonunda tmuxişi harika çözen kullanımı kullandım :

  1. Çalıştırmak tmux
  2. Uygulamanızı çalıştırın ( linksbenim durumumda) ve çalışır halde bırakın
  3. SSH oturumunu kapat, uygulama çalışmaya devam edecek
  4. Daha sonra aynı makineye SSH ile bağlanın tmux attachve uygulamayı ekrana geri getirmek için çalıştırın

tmux harika - fakat nohup veya screen gibi, sadece işleminize başlamadan önce kullanıyorsanız çalışır. Bu soru, işleminiz devam ettikten sonra tmux'a ihtiyacınız olduğunu anladığınız zamanlar ile ilgilidir.
ojrac

-1

Seansın zaman aşımına uğramasından endişeleniyor musun? Bu durumda, Ctrl-z ile işlemi bg ile yapabilirsiniz ve ardından oturumu bir "ping -t localhost" veya "top" gibi canlı tutmak için bir şeyler koyabilirsiniz.

Eğer çıkış yapmak istiyorsan, korkarım diğer yorumlara ekleyemem.


Bu çıkış meselesi.
ojrac

1
Bağlantıyı kesmenin durmasının bir başka yolu da üste koşmak. Her zaman bir kaç baytı karıştırıyor.
Rory
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.