Iniciar un proceso de Linux en segundo plano

10

Estoy tratando de crear un script que inicie algunos programas.

startup.sh

knetworkmanager
emesene
keepassx

El problema es que cuando ejecuto el script, solo se inicia knetworkmanager. Esto se debe a que lo iniciará y luego esperará a que termine. ¿Cómo puedo iniciar un programa sin esperarlo? No creo que pueda agregar "&" después de cada comando, porque todos los procesos se eliminarán cuando finalice el script.

Bart van Heukelom
fuente

Respuestas:

16

Cuando se cierra el shell que ejecuta el script, envía una señal HUP a los procesos que inició. Si esos no captan la señal, terminarán. Entonces, si solo usar & es suficiente depende de la aplicación. Para estar seguro, use nohup así:

nohup your-program >>/dev/null 2>>/dev/null &

Consulte las páginas de manual de nohup y kill para obtener más detalles o lea el artículo de wikipedia sobre nohup .

Kim
fuente
Leyendo de nuevo, es ambiguo si OP está saliendo del shell de llamada o no. Solo menciona salir del script, no salir del shell o del terminal.
Adam Bellaire
Al leer mi respuesta nuevamente, notarás que dije "cuando sale el shell que ejecuta el script". Asumiendo que este shell tiene su propio terminal virtual (no un subshell o algo así), esto es correcto.
Kim
@ Kim: Eso es cierto. Su respuesta está bien, solo estoy seguro de si el OP está cerrando el shell de llamada o no.
Adam Bellaire
10

No, los procesos no deben eliminarse cuando el script finalice si lo usa &. Intentalo.

knetworkmanager &
emesene &
keepassx &
Adam Bellaire
fuente
2

Según los programas de ejemplo que proporcionó, parece que está intentando iniciar algunos programas cuando se inicia KDE. Si es así, eche un vistazo a la función de inicio automático de KDE. Este artículo describe más y brinda instrucciones sobre cómo agregar programas al inicio automático.

Doug Harris
fuente
De hecho, eso es lo que estoy tratando de hacer. Lo arreglé ahora, gracias.
Bart van Heukelom
1

Como otros han dicho, use el &operador para poner un comando en segundo plano en el momento en que el shell lo ejecuta.

Si desea que las partes componentes se ejecuten en orden (en lugar de hacerlo de manera concisa), pero aún así desea que el todo esté en segundo plano, use un sub-shell como este:

(knetworkmanager; emesene; keepassx) &

o, si desea que la operación de cada parte esté condicionada a la finalización exitosa del uso de la parte anterior:

(knetworkmanager && emesene && keepassx) &
dmckee --- gatito ex moderador
fuente
0

Agregar un '&' después de cada comando definitivamente funcionará. Significaría que esos scripts o programas continuarían ejecutándose incluso después de que finalice startup.sh.


fuente
0

Otra opción sería comenzar el proceso como un demonio, usando / sbin / start-stop-daemon

Abhinav
fuente