como mudar o diretório e desligar o processo

0

Eu sei como mudar de diretório:

cd path

Eu sei como separar um processo:

command & , %código%, %código%, nohup command > /tmp/test_output.txt 2>&1 &

aqui está uma boa referência para isso: Como faço para destacar completamente um processo do Terminal?

Mas eu não sei como fazer as duas coisas ao mesmo tempo, isso parece impossível. Alguém pode me ajudar? Aqui estão algumas coisas que tentei:

path/command
nohup cd path && command > /tmp/test_output.txt 2>&1 &
cd path && nohup command > /tmp/test_output.txt 2>&1 &
cd path && disown command &
(cd path && disown command &)
(cd path && command) &
cd path ; command &

Eu posso chegar ao erro, eu posso fazê-lo ir para esse caminho e executar (mas não desanexado do meu terminal) ou posso executá-lo para executar o comando desanexado do meu terminal, mas no meu diretório de trabalho atual, não o caminho do cd.

Não consigo separar o processo do meu terminal e executar o comando em um diretório diferente do meu ao mesmo tempo.

Você pode me ajudar com isso? É mesmo possível?

    
por Legit Stack 26.09.2018 / 01:42

1 resposta

2

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

    
por 26.09.2018 / 08:35