Şu anda çalışan linux görevinin SSH oturumunu kapattıktan sonra öldürülmesini engelleyin


18

SSH bağlantısı üzerinden bir linux sunucusunda birkaç gün boyunca çalışan bir hesaplama görevim var. Arka planda değil, bu nedenle SSH bağlantısı görev altında.

Ssh oturumunu açtığım yerel makineyi (sunucuyu değil) yeniden başlatmak istiyorum, ancak görevi çalışmaya devam etmek istiyorum. Bu mümkün mü?

Yanıtlar:


22

Senin görevin zaten başlatılırsa, çok geç *alternatif çözümler düşünmeye senin arasına ilave katman eklemek sshoturum ve kabuk komutunu çalıştırarak gibi screen, tmux, byobu, nohupve seviyor.

Süreç desteğiniz arka plana yerleştirilecekse ve özellikle ne zaman stdoutve stderryazılamaz / kapalıysa asılmıyorsa, oturumu kapatmadan önce arka plana koyabilir ControlZve bgardından disownyerleşik ile kabuğunuzdan ayırabilirsiniz .

Örneğin:

$ ssh localhost
You have new mail.
Last login: Fri Jun  6 11:26:56 2014

$ /bin/sleep 3600    


^Z[1] + Stopped                  /bin/sleep 3600
$ bg
[1] /bin/sleep 3600&
$ jobs
[1] +  Running                 /bin/sleep 3600
$ disown %1
$ exit
Connection to localhost closed.
$ ps -ef|grep sleep
jlliagre 12864     1  0 21:12 ?        00:00:00 /bin/sleep 3600
jlliagre 13056 12477  0 21:13 pts/18   00:00:00 grep sleep
$ 

*Bob'un yorumladığı gibi, aslında Linux altında bir tty oturumunu yeniden düzenlemenin birkaç hackish yolu var. repty, retty , enjekte ve neercs . En gelişmiş reptyr gibi görünüyor, ancak ptrace işleminizi kesmek için kök ayrıcalıklarına ihtiyacınız olabilir.


Ctrl + Z'yi kullandım, iş durdu ve arka plana taşındı, sonra disownkomut gerçekleştirdi . Döndü: bash: uyarı: işlem grubu 24876 ile durdurulmuş iş 1'i silme. Şimdi işim listelendi, ps -allancak çalışmıyor gibi görünüyor (CPU kullanımı% 0)
Ali

Sürecim durdurulmuş görünüyor. Sanırım disownkomutla proces kimliği sağlamalıydım
Ali

@Ali Sanırım askıya alınmış işe devam etmek için bg komutunu çalıştırmayı unuttun.
Jason Zhu

1
@JasonZhu Bunu işaret ettiğiniz için teşekkürler. Cevabımın bgilk bölümünde komutun gerekli olmadığı belli değildi. Düzenlenen.
jlliagre

2
Bg komutunu unuttuysanız ve yalnızca disown komutunu çalıştırdıysanız, işlemin tekrar çalışmasını sağlayabilmeniz gerekir, kill -CONTbu da bg'nin yaptığı ile aynıdır.
kasperd

5

Bir çözüm GNU ekranı kullanmaktır . En fazla başlayabileceğini screenile ayırmak, sonra komutunu çalıştırın, C-a d. Daha sonra yeniden bağlanmak, yapmak screen -rve önceki oturumunuza geri döndünüz.

Ekranın diğer faydaları pencere yönetimidir (böylece komutunuz çalışırken yeni bir SSH bağlantısına gerek kalmadan diğer kabuklara geçebilirsiniz) ve geçerli oturumda veya daha sonraki bir komutta komutunuzun ön planda kalmasına izin verir.

Düzenleme: Yorumlarda belirtildiği gibi, bu yalnızca screenkomutu çalıştırmadan önce başlatmayı hatırlarsanız çalışır. Komut zaten çalışıyorsa, @ jlliagre'nin çözümüne ihtiyacınız olacaktır.


2
tmuxscreengeçerli SSH bağlantınıza bağlı olmayan uzak bir oturum yapmanızı sağlayan başka bir programdır .
Darth Android

2
Çözümünüz harika. Ancak benim sorum tamamen uymuyor - şu anda çalışan süreç hakkında sordum, gelecekte kullanmak için bir süreç değil screen.
Ali

Ah tamam. Bu durumda, @ jlliagre'nin çözümünü kullanmanız gerekeceğini düşünüyorum. (Bildiğim kadarıyla, halihazırda çalışan bir işlemi screenveya benzeri bir şeye bağlamanın bir yolu yoktur tmux.)
Scott Weldon

1

Bunu yapmanın "standart" yollarından biri, şu şekilde nohupdahil edilen komutu kullanmaktır coreutils:

nohup COMMAND [ARGS] &

Ancak komut , programın çıktısını ( STDOUT& STDERRAFAIK) bir dosyaya yönlendirir nohup.out, böylece bazen bir şekilde can sıkıcı olur (büyük bir günlük dosyası oluşturmak gibi), böylece kendi yönlendirmenizi yapmak veya / dev / null'a yönlendirmek isteyebilirsiniz. Eğer istersen.


2
Yeniden oku. İşlem zaten çalışıyor .
Monica ile Hafiflik Yarışları

/ utanma dikkatle okumadı. Afedersiniz.
wangguoqin1001

Aslında nohupbunun için kullanılabilir. Sadece çalışan işlemi askıya alın ve arka plana gönderin ( Ctrl+ Zve çalıştırın bg) ve sonra yayınlayabilirsiniz nohup %1.
mike

0

Ayrıca nohup"&" ve alt kabuğu kullanarak işlemi arka planda başlatabilirsiniz:

Komutu & ile sonlandırın ve parantez içine alın

$ (thecommand args &)

Diyelim ki süreç 1922 pidini kazanıyor:

$ ps -f
UID        PID  PPID  C STIME TTY          TIME CMD
usr      11473  2643  0 15:07 pts/1    00:00:00 bash
usr      11922     1  0 15:11 pts/1    00:00:00 thecommand

Orijinal ebeveyni olan 11473 kabuk işleminden bağımsız olduğunu görün. Bu nedenle, mevcut kabuktan (11473) çıkarsanız veya öldürürseniz, işlem 11922 çalışmaya devam eder ve bu, puanlardan ayrılır.

Kabuktan çıkmaya çalışın ve yeni bir kabuk girin. Bu kabuk aynı puanlara bağlı olsa bile, işlemi şimdi bir puan olmadan görebilirsiniz:

$ ps -fp 11922
UID        PID  PPID  C STIME TTY          TIME CMD
usr      11922     1  0 15:11 ?        00:00:00 thecommand

Posix'te nasıl adlandırıldığını veya belgelendiğini bilmiyorum, ancak 1990'dan beri bsh, ksh ve şimdi bash'da kullanıyorum.

Son olarak, bgyerleşik kabuk komutunu kullanabilirsiniz:

Programınızı başlatın ve duraklatmaya karar verirseniz veya arka planda tutmayı planlıyorsanız CTRL + Z yazın:

$ thecommand
^Z
[1] Stopped          thecommand

Şimdi arka planda çalışmaya devam etmesine izin verin:

$ bg
[1]+ thecommand &

Süreç bilgilerine bakarsanız, bunun henüz bir üst süreci yoktur:

$ ps -f
UID        PID  PPID  C STIME TTY          TIME CMD
usr      12046  2643  0 15:18 pts/6    00:00:00 bash
usr      12571 12046  0 16:00 pts/6    00:00:00 thecommand
usr      12601 12046  0 16:04 pts/6    00:00:00 ps -f

Yani, mevcut işlemden çıkın. Arka planda çalışan işlem orijinal üst öğesinden bağımsızdır ve arka planda çalışmaya devam eder:

$ exit

Tekrar giriş yapın ve işlem bilgilerine bakın:

$ ps -f 12571
UID        PID  PPID  C STIME TTY          TIME CMD
usr      12571     1  0 16:00 ?        00:00:00 thecommand
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.