Existem diferenças entre nohup
, disown
e &
(você também pode encontrar < um href="https://unix.stackexchange.com/a/318428/108618"> esta resposta interessante).
A sintaxe disown command
que você usou é inválida, pelo menos no Bash; veja help disown
. Em alguns casos command & disown
é suficiente, mas
[
command
] still is connected to the terminal, so if the terminal is destroyed [...], the program will fail as soon as it tries to read from standard input or write to standard output.
Portanto, nohup command &
parece melhor, no entanto
nohup
does not remove the process from the shell's job control
Isso parece bastante inofensivo, mas se incomoda você, apenas disown
do trabalho:
nohup command &
disown
Mas, se o trabalho terminar antes de disown
, você rejeitará outro trabalho (se houver). O jeito certo de fazer isso no Bash é use $!
:
$!
Expands to the process ID of the job most recently placed into the background
Então, isso é melhor:
nohup command &
disown $!
(Já que disown
depois de nohup
é basicamente cosmético, vou omiti-lo a partir de agora. Use-o se precisar).
Para cd
antes de command
sem afetar o shell atual, a melhor maneira é fazê-lo em um subshell (você tentou, mas não com nohup
):
(cd path && nohup command) &
ou até mesmo
(cd path && exec nohup command) &
onde exec
torna nohup
substituir o processo subshell que não é mais necessário; nohup
será então substituído por command
porque é assim que a ferramenta funciona. Desta forma, você acaba com um processo em vez de muitos.
Como alternativa, você pode nohup
um shell inteiro. Isso permite que você execute vários comandos:
nohup sh -c 'cd path || exit; command1; command2' &
(Nesse caso, exec
só faz sentido antes de command2
).
Observação nohup
cria um arquivo nohup.out
, a menos que você redirecione sua saída (consulte man 1 nohup
). Onde o arquivo é criado depende do diretório de trabalho atual do processo nohup
, então, em geral, faz diferença se você cd
antes de nohup
( cd path && nohup ...
) ou o contrário ( nohup sh -c 'cd path ... '
).