it-swarm-tr.com

Önceden başlatılmış bir işlemi Nohup / ekranlayabilir miyim?

SSH üzerinden uzun süredir çalışan veri taşıma komut dosyalarının bazı test çalışmalarını yapıyorum. Diyelim ki saat 16.00'da bir senaryo çalıştırmaya başladım; şimdi, 6 PM yuvarlanıyor ve bunu screen içinde yapmamaya çalışıyorum.

Bir işlemi "geriye dönük olarak" Nohup sürecinin herhangi bir yolu var mı yoksa bilgisayarımı bütün gece çevrimiçi bırakmam gerekir mi? screen 'i/Nohup' a zaten başlattığım bir sürece eklemek mümkün değilse, neden? Ebeveyn/çocuk süreçlerin nasıl etkileşime girdiğiyle ilgili bir şey var mı? (En azından 'neden' sorusuna cevap vermeyen "hayır" cevabını kabul etmeyeceğim - üzgünüm;))

262
ojrac

Bash kullanıyorsanız disown -h job

disown

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

Seçenekler olmadan, her jobpec aktif işler tablosundan kaldırılır. Eğer -h seçeneği belirtilirse, iş tablodan kaldırılmaz, ancak Shell bir SIGHUP alırsa SIGHUP işe gönderilmeyecek şekilde işaretlenir. Jobspec yoksa ve -a veya -r seçeneği sağlandığında, geçerli iş kullanılır. Hiç jobpec sağlanmazsa, -a seçeneği, tüm işleri kaldırmak veya işaretlemek anlamına gelir; -r jobspec bağımsız değişkeni olmayan bir seçenek, işlemi çalışan işleri kısıtlar.

212
gharper

Kullanım reptyr

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ı tarafından birkaç blog yazısı:

82
Jonathan Tran

Bir tty'den şu anki tty'ye kadar bir işlemi çalmak için bu hack'i denemek isteyebilirsiniz:

http://www.ucc.asn.au/~dagobah/things/grab.c

Mevcut Linux/glibc sürümlerini derlemek için yeniden biçimlendirilmesi gerekiyor, ancak yine de çalışıyor.

22
Juliano

Bir işlem başladığında STDIN, STDOUT ve STDERR bir şey öğesine bağlanır. Genellikle komut başlatıldıktan sonra bunu değiştiremezsiniz. Tanımladığınız durumda, bu muhtemelen ssh oturumuyla ilişkilendirilmiş bir tty'dir. Nohup hemen hemen ...

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

Yani, STDIN öğesini/dev/null, STDOUT öğesini bir dosyaya ve STDERR öğesini STDOUT olarak ayarlar. Ekran, kendisine yönlendiren tty'ler kurmayı içeren çok daha karmaşık şeyler yapar.

Çalışan bir işlemi geriye dönük olarak Nohup yapmak veya taramak için hiçbir yol bilmiyorum./Proc/$ pid/fd'ye cd yaparsanız ve 0, 1 ve 2'nin neyi gösterdiğini görürseniz.

Reddetme konusunda biraz şansınız olabilir, ancak süreç STDIN, STDOUT veya STDERR ile bir şey yapmaya çalışırsa değil.

17
freiheit

Ekran kısmı için neden olmadan basit bir "Hayır" verebilirim.

Ancak disown (bash yerleşimini) denediniz mi

~ $ 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.
13
serverhorror

Cryopid , grab.c'nin yazarından, bir işlemi bir dosyaya dondurup, işlemi devam ettirmek için (ekranın içinde) çalıştırdığınız bir başka gelişmedir.

13
TRS-80

Solaris/OpenSolaris'teki Nohup'ta çalışan bir işlemi Nohup yapmak için bir -p bayrağı vardır - örneğin, Solaris 10 Nohup man sayfası konusuna bakın.

9
alanc

Geçenlerde --- bir renk ascii-art kütüphanesi olan libcaca kullanılarak oluşturulan ekran benzeri bir yardımcı program olan neercs bağlantısını gördüm. Diğer özelliklerin yanı sıra, mevcut bir işlemi yakalama ve neercs (screen) oturumunuzda yeniden ebeveynleştirme yeteneğine sahiptir.

Ancak ben kullanmadım, bu yüzden işe yarayıp yaramadığı hakkında yorum yapamam.

5
Daniel Lawson

İşlem çıktısını gdb ile dosyaya yönlendirebilirsiniz

https://blog-en.openalfa.com/how-to-detach-from-the-terminal-a-running-process-in-linux

ve sonra reddetti

Upd: Ubuntu 18.04'te gdb'yi Sudo ve biraz farklı gdb komutuyla çalıştırmak zorunda kaldım:

p (int)dup2(open("/tmp/test.stdout", 1), 1)

2
d9k

Muhtemelen bunu düşünmüyorum, bu yüzden beni düzeltmekten çekinmeyin (daha önce reddetme hakkında öğrendim!) ... Bir ctrl-Z ve "bg" en azından arka planda işlem yapmak için işe yaramaz mı? Yoksa çalışırken STDOUT'u görmek istediğiniz temel sorun mu?

2
Chris_K

İşlemle etkileşime girememekle yaşayabiliyorsanız ve rastgele çekirdek modülleri yüklemeye itiraz etmiyorsanız, Snoop konusuna bakmaktan daha kötüsü yapabilirsiniz. Alternatif olarak, birkaç proje daha var. Here çoğunlukla yapmak istediğinizi yapabilen bir çağrı kodudur.

2
David Pashley

Nohup komut satırı tarayıcısını başlatmak ve karmaşık kimlik doğrulama işlemi ve bir sürü ASP.NET web sitesinden bir dosya indirmek için sonra eklemek için links (veya benzeri) kullanmak istedim kullanımı zorlaştıran gizli görünüm durumu curl/wget ile işi yapar.

Sonunda işi sadece harika çözdü tmux kullanarak sona erdi:

  1. tmux çalıştır
  2. Uygulamanızı çalıştırın (benim durumumda links) ve çalışır durumda bırakın
  3. SSH oturumunu kapat, uygulama çalışmaya devam edecek
  4. SSH ile daha sonra aynı makineye bağlanın ve tmux attach Uygulamayı tekrar ekrana getirmek için
1
Dmitry Gusev