Esto es lo que necesito que suceda:
- iniciar el proceso A en segundo plano
- espera x segundos
- iniciar el proceso B en primer plano
¿Cómo puedo hacer que la espera suceda?
Estoy viendo que 'dormir' parece detener todo y en realidad no quiero 'esperar' a que el proceso A termine por completo. He visto algunos bucles basados en el tiempo, pero me pregunto si hay algo más limpio.
sleep
detiene el proceso A? ¿Puede mostrar el proceso de prueba que está utilizando o una salida indicativa de esto? Si el proceso A se detiene, es más probable que esté tratando de leer desde el terminal mientras se ejecuta en segundo plano y se detiene por esa razón, en lugar de cualquier cosa relacionadasleep
.process_a </dev/null &
adjuntará su stdin en/dev/null
lugar del TTY, y eso puede ser suficiente para evitar el problema.Respuestas:
A menos que esté malinterpretando su pregunta, simplemente se puede lograr con este breve script:
(y agregue un extra
wait
al final si desea que su script espere aprocess_a
que termine antes de salir).Incluso puede hacer esto como una línea, sin la necesidad de un script (como lo sugiere @BaardKopperud):
fuente
bash
eso, cualquier shell lo hará, incluido el de su sistemash
, por lo que no necesita agregar una dependencia de bash para su script.Puede usar el operador de control de fondo (&) para ejecutar un proceso en segundo plano y el
sleep
comando esperar antes de ejecutar un segundo proceso, es decir:Aquí hay un ejemplo de dos comandos que imprimen algunos mensajes con marca de tiempo:
Ejecútelo para verificar que exhibe el comportamiento deseado:
fuente
Me gusta la respuesta de @ dr01, pero él no verifica el código de salida, por lo que no sabe si tuvo éxito o no.
Aquí hay una solución que verifica los códigos de salida.
Por lo general, almaceno los PID en una matriz bash y luego la comprobación de pid es un bucle for.
fuente
A & sleep x; B; ret=$?; wait "$!" || exit "$ret"
process_b
correr en primer plano. Presumiblementeprocess_a
podría salir mientras seprocess_b
está ejecutando, pero aún puedewait
hacerlo y obtener el estado de salida después de haber recopilado el estado de salida del primer plano deprocess_b
la manera normal,$?
directamente.