Cómo bifurcar totalmente un comando de shell que está usando la redirección


13

He escrito bastantes scripts de shell a lo largo de los años (pero ciertamente no soy un administrador de sistemas) y hay algo que siempre me causó problemas: ¿cómo puedo bifurcar un comando de shell inmune a las interrupciones en segundo plano de un script de Bash ?

Por ejemplo si tengo esto:

command_which_takes_time input > output

¿Cómo puedo "nohup" y bifurcar esto?

Lo siguiente no parece hacer lo que quiero:

nohup command_which_takes_time input > output &

¿Cuál es la sintaxis que estoy buscando y qué no entiendo?

Respuestas:


13

Intenta crear subshell con (...):

( command_which_takes_time input > output ) &

Ejemplo:

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

Deberías intentarlo setsid(1). Úselo como lo haría nohup:

setsid command_which_takes_time input > output

Esto (según la página de setsid(2)manual), hace un fork(2), uno _exit(2)del proceso padre, luego el proceso hijo llama setsid(2)para crear un nuevo grupo de procesos (sesión).

No puede matar eso cerrando sesión, y no es parte del shebang de control de trabajo de Bash. Para todos los efectos, es un demonio adecuado.


4

Hay un disowncomando bash incorporado:

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

Después del rechazo , el trabajo se retira de su shell (por lo que incluso puede cerrar sesión) y aún permanece en ejecución hasta que finalice.

Vea el 1er jobscomando enlistado, sleepsin embargo, el 2do jobsdespués del rechazo no lo hizo. Pero usando el pspodemos ver que el trabajo todavía se está ejecutando.


2

Freebsd:

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

-2

Esto funcionará (no escriba ningún espacio adicional):

command &>output.file

1
Esto parece no tener nada que ver con la pregunta, porque no se bifurca ni alcanza el equivalente de nohup.
Dan Getz
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.