Executando vários comandos nohup em segundo plano

12

Tem dois comandos cmd1 e cmd2. Dos dois, o cmd2 leva mais tempo para terminar. Precisa executar o cmd2 e depois o cmd1.

Tentou executá-los da seguinte maneira:

bash$ (nohup ./cmd2>result2 &) && nohup ./cmd1>result1 &

ou

bash$ (nohup ./cmd2>result2 &) ; nohup ./cmd1>result1 &

Mas o tempo que vejo cmd1 não está esperando o cmd2 terminar e o resultado1 é preenchido.

Como fazer com que o cmd1 seja executado após o cmd2, quando ambos devem ser processados ​​nohup e executados em segundo plano?

user33767
fonte
Esta questão já é solicitado unix.stackexchange.com/questions/67006/...
Rahul Patil
2
A questão no unix.stackexchange.com/questions/67006/… é um pouco diferente, pois eu queria manter minha ordem de execução. Por favor, corrija-me se estiver errado ao entender a outra pergunta.
user33767

Respostas:

12

Você fez os dois cmd1e cmd2corre em paralelo. Você disse: “Inicie o cmd2 em segundo plano e interrompa qualquer associação com ele. Inicie o cmd1 em segundo plano e interrompa qualquer associação com ele. ” Você quis dizer: “Inicie o cmd2 em segundo plano; quando estiver concluído, inicie o cmd1 (também em segundo plano). " Como não há mais nenhuma associação com a tarefa em segundo plano, é necessário criar uma tarefa em segundo plano que execute cmd2 e cmd1. Isso é cmd2; cmd1(ou melhor, cmd2 && cmd1executar o cmd1 somente se o cmd2 for bem-sucedido), e você precisará informar nohuppara iniciar um shell em execução em segundo plano para isso.

nohup sh -c './cmd2 >result2 && ./cmd1 >result1' &
Gilles 'SO- parar de ser mau'
fonte
Obrigado. Está funcionando bem. Sim, era o que eu estava pensando, depois de colocar o primeiro cmd em segundo plano, ele não afeta o segundo comando, que é iniciado mesmo que eu esperasse que o primeiro comando terminasse. Preciso ler o manual sobre o envio de comandos para segundo plano.
user33767
3

Se você não se importa em não usar nohup:

{ command1 >result1 2>&1 && command2 >result2 2>&1 ; } & disown
artyom
fonte
Irá verificar isso. Mas atualmente irá com resposta de Giles, onde o comando está envolto com sh. De qualquer forma, obrigado #
33337
Esta é uma má ideia. Quando o usuário sai do console, ele mata a sessão.
mootmoot
@mootmoot isso funciona como planejado, verifique por si mesmo; Os comandos não receberão SIGHUP quando o shell pai sair.
Artyom 10/03
Sim, é seguro para shell se você executar o comando usando crond / crontab. Mas não é seguro para pty / xterm / ssh. unix.stackexchange.com/questions/3886/…
mootmoot 10/17
2

Basta usar:

nohup ./cmd2>result2 & nohup ./cmd1>result1 & nohup ./cmd3>result3 &
Rahul Patil
fonte
Enquanto executar o comando múltiplo é bom, eu queria manter a ordem exata de execução, ou seja, cmd2 primeiro e depois cmd1 e isso não está acontecendo com o comando acima. graças
user33767
0

informe-nos exatamente o que você está fazendo com cmd2 e cmd1. Depende do tipo de tarefa e saída que você deseja do seu comando. Se você está enfrentando problemas ao pressionar duas vezes a tecla Enter com o comando, isso pode ser descoberto pelo meu post

você pode ir por esse caminho também

nohup `cmd2 && ccmd1` > Output.out 2> Error.err < /dev/null & 

Veja a captura de tela abaixo, aqui estou usando 3 comandos e todos estão executando um a um em série. Eu usei backticks para esta tarefa. Na captura de tela, você também pode observar o carimbo de data e hora. O comando sleep tem 60 segundos; portanto, após 60 segundos, meu próximo comando é executado com êxito. Eu usei o comando jobs para verificar se existe algum comando ainda em execução em segundo plano. Aqui não. dos trabalhos que você pode ver é 1.

comando nohup-múltiplo

Esta captura de tela também está disponível neste link , se não estiver visível

Sharad Chhetri
fonte