Forçando um processo para plano de fundo a partir do script bash

0

Estou tentando criar um script básico que, entre outras coisas, começa com o sunwait:

/root/bin/sunwait sun up -0:00:00 54.453158N 11.013071E; mycommand &

Sunwait é um binário que espera que eventos astronômicos ocorram antes de executar um determinado comando. Eu usei o e comercial no final para enviá-lo ao plano de fundo para que meu script possa continuar a fazer outras coisas, mas isso não funciona e não sei por quê.

Executar o comando diretamente no shell também não enviará sunwait para o segundo plano. Eu tentei nohup também sem sucesso.

Estou no Ubuntu 14.04 Server LTS. Por que não está funcionando?

    
por Niksac 31.03.2015 / 12:35

2 respostas

1

Sunwait is a binary that will wait for astronomical events to happen before executing a given command.

Depois de examinar sua sintaxe, acho que essa interpretação está errada. No seu exemplo, sunwait não executa nada, na verdade, não há nenhum comando dado a ele. Eu não estou familiarizado com sunwait , mas uma pesquisa rápida revelou-me que apenas espera por um evento astronómico e depois termina.

No seu caso, é assim:

  • O shell lê a linha, encontra o semicolon ; e executa tudo nesse ponto - ou seja, o sunwait com suas opções de linha de comando.
  • O shell aguarda que sunwait termine.
  • Por fim, sunwait termina, portanto, o shell prossegue para mycommand e o executa em segundo plano devido ao e comercial & .

Portanto, a resposta direta à sua pergunta é mais comum: ela não está "funcionando" (não fazendo o que você quer) porque está funcionando (fazendo o que você comanda).

Corrigir:

  1. { /root/bin/sunwait sun up -0:00:00 54.453158N 11.013071E; mycommand; } &

  2. ou /root/bin/sunwait sun up -0:00:00 54.453158N 11.013071E && mycommand &

Na primeira linha, os dois comandos dentro de {} aparecem para & como se fosse um único comando, então tudo vai para o segundo plano. Simples e muitas vezes bom o suficiente. O segundo caso é um pouco diferente: mycommand será executado se e somente se sunwait terminar sem erro (a menos que sunwait seja mal codificado). É o comportamento que você esperava em primeiro lugar, não é? Pessoalmente, acho a segunda correção mais elegante. Imagine que você cometeu um erro ao digitar mycommand e percebeu depois de um tempo que é uma bomba-relógio. Matar sunwait irá acionar a bomba no 1º cenário, desativá-la no 2º.

    
por 31.03.2015 / 23:42
1

Sua linha tem dois comandos, separados por um ponto-e-vírgula ( ; ). Você precisa enviar os dois comandos para o segundo plano:

/root/bin/sunwait sun up -0:00:00 54.453158N 11.013071E & mycommand &

Ou, se você quiser que os comandos sejam executados um após o outro, execute os dois em uma subcamada e em plano de fundo que:

( /root/bin/sunwait sun up -0:00:00 54.453158N 11.013071E; mycommand ) &

Acredito que o último exemplo é o que você está tentando alcançar, já que o primeiro iniciará ambos os comandos agora e os contextualizará.

    
por 31.03.2015 / 23:47