Come eseguire il fork di un comando shell che utilizza il reindirizzamento


13

Ho scritto diversi script di shell nel corso degli anni (ma di certo non sono un amministratore di sistema) e c'è qualcosa che mi ha sempre causato problemi: come posso eseguire il fork di un comando shell immune da blocchi in background da uno script Bash ?

Ad esempio se ho questo:

command_which_takes_time input > output

Come posso "nohup" e rovesciare questo?

Quanto segue non sembra fare quello che voglio:

nohup command_which_takes_time input > output &

Qual è la sintassi che sto cercando e cosa non capisco?

Risposte:


13

Prova a creare subshell con (...):

( command_which_takes_time input > output ) &

Esempio:

~$ ( (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

Dovresti provare setsid(1). Usalo come faresti con nohup:

setsid command_which_takes_time input > output

Questo (come per la setsid(2)manpage), fa un fork(2), un _exit(2)processo genitore, quindi il processo figlio chiama setsid(2)per creare un nuovo gruppo di processi (sessione).

Non puoi ucciderlo disconnettendoti e non fa parte dello shebang di controllo del lavoro di Bash. A tutti gli effetti, è un demone appropriato.


4

c'è il disowncomando incorporato bash:

[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:~#

Dopo la disconnessione , il lavoro viene ignorato dalla shell (quindi è anche possibile disconnettersi) e rimane ancora in esecuzione fino al termine.

Vedere il 1 ° jobscomando elencato, sleeptuttavia il 2 ° jobsdopo il rifiuto non è stato. Ma usando il pspossiamo vedere che il lavoro è ancora in esecuzione.


2

FreeBSD:

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

-2

Funzionerà (non digitare spazi extra):

command &>output.file

1
Questo sembra non avere nulla a che fare con la domanda, perché non si biforca o raggiunge l'equivalente di nohup.
Dan Getz,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.