É isso que eu preciso que aconteça:
- iniciar o processo A em segundo plano
- aguarde x segundos
- iniciar o processo B em primeiro plano
Como posso fazer a espera acontecer?
Estou vendo que "dormir" parece interromper tudo e, na verdade, não quero "esperar" pelo processo A terminar completamente. Eu já vi alguns loops baseados no tempo, mas estou me perguntando se há algo mais limpo.
sleep
interrompe o processo A? Você pode mostrar o processo de teste que você está usando ou produzir um indicativo disso? Se o processo A estiver sendo interrompido, é mais provável que ele esteja tentando ler a partir do terminal enquanto estiver executando em segundo plano e for interrompido por esse motivo, em vez de algo relacionado asleep
.process_a </dev/null &
irá anexar sua stdin a/dev/null
vez do TTY, e que pode ser suficiente para evitar o problema.Respostas:
A menos que eu esteja entendendo mal sua pergunta, ela pode simplesmente ser alcançada com este pequeno script:
(e adicione um acréscimo
wait
no final, se você quiser que seu script espere paraprocess_a
terminar antes de sair).Você pode até fazer isso como uma linha, sem a necessidade de um script (como sugerido por @BaardKopperud):
fonte
bash
disso, pois qualquer shell incluirá o sistemash
, portanto, você não precisa adicionar uma dependência no bash para o seu script.Você pode usar o operador de controle em segundo plano (&) para executar um processo em segundo plano e o
sleep
comando para aguardar antes de executar um segundo processo, ou seja:Aqui está um exemplo de dois comandos que imprimem algumas mensagens com registro de data e hora:
Execute-o para verificar se ele exibe o comportamento desejado:
fonte
Eu gosto da resposta do @ dr01, mas ele não verifica o código de saída e, portanto, você não sabe se teve sucesso ou não.
Aqui está uma solução que verifica os códigos de saída.
Normalmente, eu armazeno os PIDs em uma matriz do bash e a verificação do pid é um loop for.
fonte
A & sleep x; B; ret=$?; wait "$!" || exit "$ret"
process_b
rodar em primeiro plano. Presumivelmente,process_a
pode sair enquantoprocess_b
estiver em execução, mas você ainda podewait
obtê-lo e obter o status de saída depois de coletar o status de saída do primeiro planoprocess_b
da maneira normal,$?
diretamente.