Yeniden yönlendirme kullanan bir kabuk komutunu tamamen çatallama


13

Yıllar boyunca birkaç kabuk komut dosyası yazdım (ama kesinlikle bir sysadmin değilim) ve her zaman bana sorunlara neden olan bir şey var: bir Bash komut dosyasından arka plandaki bağışıklıklara karşı bir bağışıklık komutunu nasıl bağlayabilirim ?

Örneğin, bu varsa:

command_which_takes_time input > output

Bunu nasıl "nohup" yapabilir ve çatallayabilirim?

Aşağıdakiler istediğimi yapmıyor gibi görünüyor:

nohup command_which_takes_time input > output &

Aradığım sözdizimi nedir ve neyi anlamıyorum?

Yanıtlar:


13

Şununla alt kabuk oluşturmayı deneyin (...):

( command_which_takes_time input > output ) &

Misal:

~$ ( (sleep 10; date) > /tmp/q ) &
[1] 19521
~$ cat /tmp/q # ENTER
~$ cat /tmp/q # ENTER
(...) #AFTER 10 seconds
~$ cat /tmp/q #ENTER
Wed Jan 11 01:35:55 CET 2012
[1]+  Done                    ( ( sleep 10; date ) > /tmp/q )

18

Denemelisin setsid(1). Kullanacağınız gibi kullanın nohup:

setsid command_which_takes_time input > output

Bu (gereğince setsid(2), bir does man sayfasına) fork(2), bir _exit(2)ebeveyn sürecinin ardından çocuk süreç çağrıları setsid(2)yeni bir süreç grubu (oturum) oluşturun.

Oturumu kapatarak öldüremezsiniz ve bu Bash iş kontrolünün bir parçası değildir. Tüm niyet ve amaçlar için, bu uygun bir cintir.


4

orada disownbash yerleşik komutu:

[1] 9180
root@ntb1:~# jobs
[1]+  Running                 sleep 120 &
root@ntb1:~# disown
root@ntb1:~# jobs
... no jobs, disowned
root@ntb1:~# ps aux | grep sleep | grep -v grep
root      9180  0.0  0.0   4224   284 pts/0    S    17:55   0:00 sleep 120
... but the sleep still runing
root@ntb1:~#

Reddedildikten sonra iş kabuğunuzdan çıkarılır (böylece çıkış yapabilirsiniz) ve bitene kadar hala çalışmaya devam eder.

jobsListelenen ilk komuta bakmayın, sleepancak jobsreddetmekten sonraki 2. komut . Ama kullanarak, psişin hala devam ettiğini görebiliriz.


2

freebsd:

/usr/sbin/daemon -f <command> <command args>

-2

Bu işe yarayacaktır (fazladan boşluk yazmayın):

command &>output.file

1
Bunun soru ile bir ilgisi yok gibi görünüyor, çünkü çatallanmıyor veya eşdeğerini elde etmiyor nohup.
Dan Getz
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.