Como extrair totalmente um comando shell que está usando o redirecionamento

12

Eu escrevi alguns shell scripts ao longo dos anos (mas eu certamente não sou um administrador de sistemas) e há algo que sempre me causou problemas: como eu posso bifurcar um comando de shell imune a restrições em segundo plano de um < em> script Bash ?

Por exemplo, se eu tiver isso:

command_which_takes_time input > output

Como posso "nohup" e bifurcar isso?

O seguinte não parece fazer o que eu quero:

nohup command_which_takes_time input > output &

Qual é a sintaxe que estou procurando e o que não estou entendendo?

    
por Cedric Martin 11.01.2012 / 01:21

5 respostas

13

Tente criar um subshell com (...) :

( command_which_takes_time input > output ) &

Exemplo:

~$ ( (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 )
    
por 11.01.2012 / 01:38
17

Você deve tentar setsid(1) . Use como você usaria nohup :

setsid command_which_takes_time input > output

Isso (de acordo com a% man_de% manpage), faz um setsid(2) , um fork(2) do processo pai, então o processo filho chama _exit(2) para criar um novo grupo de processos (sessão).

Você não pode matar isso fazendo logout, e isso não faz parte do controle de trabalho Bash. Para todos os efeitos, é um daemon adequado.

    
por 11.01.2012 / 18:44
3

disown bash comando interno:

root@ntb1:~# sleep 120 & [1] 9180 root@ntb1:~# jobs [1]+ Running sleep 120 & root@ntb1:~# disown root@ntb1:~# jobs 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 root@ntb1:~# Após disown , o trabalho é desconsiderado do seu shell (assim você pode até mesmo sair) e ainda continua em execução até terminar.

Veja o 1o jobs do comando listou o sleep , mas o segundo jobs depois do não aconteceu. Mas, usando o ps , podemos ver que o trabalho ainda está em execução.

    
por 13.11.2015 / 18:03
2

Freebsd:

/usr/sbin/daemon -f <command> <command args>
    
por 27.09.2012 / 18:43
-2

Isso funcionará (não digite espaços extras):

command &>output.file
    
por 09.07.2014 / 17:13