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;))
Bash kullanıyorsanız disown -h job
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.
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ı:
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.
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.
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.
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.
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.
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.
İş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)
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?
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:
tmux
çalıştırlinks
) ve çalışır durumda bırakıntmux attach
Uygulamayı tekrar ekrana getirmek için