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
nohupdoes 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 ... ' ).