Cómo iniciar un programa en segundo plano

9

El programa Boblight no se ejecuta en segundo plano. No hay una diferencia notable entre ejecutar

sudo boblightd

y

sudo boblightd& 

¿Cómo puedo resolver este problema de que la consola no bloqueará más entradas?

pi@raspberrypi ~/boblight/boblightd-for-raspberry-master $ sudo boblightd
Boblightd 2.0 (optimized version for raspberry) (c) 2013 Speedy1985 and Heven)
(InitLog)                       start of log /root/.boblight/boblightd.log
(PrintFlags)                    starting boblightd
(CConfig::LoadConfigFromFile)   opening /etc/boblight.conf
(CConfig::CheckConfig)          checking config lines
(CConfig::CheckConfig)          config lines valid
(CConfig::BuildConfig)          building config
(CConfig::BuildConfig)          built config successfully
(main)                          starting devices
(CClientsHandler::Process)      opening listening TcpSocket on *:19333
(CDevice::Process)              ambilight: starting with output "/dev/spidev0.0"
(CDevice::Process)              ambilight: setting up
(CDevice::Process)              ambilight: setup succeeded


pi@raspberrypi ~/boblight/boblightd-for-raspberry-master $ sudo boblightd&
[1] 2289
pi@raspberrypi ~/boblight/boblightd-for-raspberry-master $
Boblightd 2.0 (optimized version for raspberry) (c) 2013 Speedy1985 and Heven)
(InitLog)                       start of log /root/.boblight/boblightd.log
(PrintFlags)                    starting boblightd
(CConfig::LoadConfigFromFile)   opening /etc/boblight.conf
(CConfig::CheckConfig)          checking config lines
(CConfig::CheckConfig)          config lines valid
(CConfig::BuildConfig)          building config
(CConfig::BuildConfig)          built config successfully
(main)                          starting devices
(CClientsHandler::Process)      opening listening TcpSocket on *:19333
(CDevice::Process)              ambilight: starting with output "/dev/spidev0.0"
(CDevice::Process)              ambilight: setting up
(CDevice::Process)              ambilight: setup succeeded
usuario2534685
fuente
8
Por ejemplo:sudo boblightd > /dev/null 2>&1 &
devnull
Si no está haciendo esto con el propósito de aprender, úselo dmenu. Es simple y hace el trabajo bastante bien.
Nishant

Respuestas:

22

El [1] 2289comando after your background muestra que funcionó, y de hecho se puso en segundo plano.

Pero la salida de su comando seguirá yendo a la terminal, a menos que redirija. Aquí está la manera integral de hacer eso:

sudo boblightd >std.txt 2>err.txt &

Si desea que stdout y stderr vayan al mismo archivo:

sudo boblightd >std.txt 2>&1 &

Y, por supuesto, si no le importa la salida de una o ambas secuencias, puede enviar a en /dev/nulllugar de un nombre de archivo.

sudo boblightd >/dev/null 2>err.txt &

(ese ejemplo arroja la salida estándar, pero mantiene stderr, en caso de que algo salga mal).


ACTUALIZAR

Lo anterior se basa en el desconocimiento de lo que es boblightd. Veo en otra respuesta que tiene un modo demonio, por lo que debería usarse en este caso.

Por cierto, lo anterior supone sudoque no solicitará una contraseña y que no cerrará la ventana del terminal. Para el primero, personalmente uso normalmente sudo bash, escribiría boblightd >std.txt 2>err.txt &. Otra forma es hacer sudo lso algún comando inofensivo para asegurarse de que el acceso se almacena en caché.

Para este último, nohupes el comando mágico para asegurarse de que siga funcionando incluso después de salir del edificio. Iría después del sudoy antes del comando real. Por ej sudo nohup boblightd >std.txt 2>err.txt &. O sudo bashentonces nohup boblightd >std.txt 2>err.txt &, entonces exit(para salir del shell de raíz).

Darren Cook
fuente
También es importante tener en cuenta que si sudointenta solicitar la contraseña, fallará porque los procesos en segundo plano no pueden leer STDIN.
Patrick
Gracias @Patrick. Acababa de responder sobre el problema inmediato en la pregunta, pero como esto está recibiendo algo de atención, he actualizado con la mención de solicitud de contraseña y nohup.
Darren Cook el
5

Creo que puedes usar un comando nohup como este:

nohup sudo boblightd &

esto pondrá la salida de su comando al archivo nohup.out en el directorio actual.

También puede usar un comando de pantalla como este: primero cree una pantalla:

screen -S your-sreen-name

luego ejecuta tu comando:

sudo boblightd

Para guardar la pantalla y volver al terminal, escriba Ctrl+AD( Ctrl+Aes la pista para la screenque desea hacer algo y Dluego "d" etaches de la sesión sin detenerlo).

restaurar su pantalla:

screen -d -r your-screen-name

fuente
4

Tendrá que redirigir stdout y stderr a algo más que sus valores predeterminados para ocultarlos. El comentario de @ devnull muestra cómo hacer esto. Ese es un primer paso.

Si simplemente utiliza &para separar su programa, se eliminará automáticamente cuando cierre la sesión. Eso probablemente no sea lo que quieres. Tendrás que usar el nohupcomando para evitar esto:

nohup sudo boblightd > boblight.out 2> boblight.err < /dev/null &

Tenga en cuenta que sudoprobablemente solicitará una contraseña: no obtendrá ninguna, y no notará que le está pidiendo una, ya que cada salida / entrada se redirige. Tienes diferentes soluciones para lograr esto de todos modos:

  • Ejecute un sudocomando antes, sudoguardará su contraseña. Esa es la manera rápida y sucia.
  • Elimine el &, proporcione sudola contraseña, luego envíe el proceso a segundo plano con CTRL + Z.
  • También puede configurar sudo para que no solicite la contraseña para este usuario específico y esta pareja ejecutable. Tenga en cuenta que podría ser una posible violación de seguridad, ...
Marc Plano-Lesay
fuente
¿Es mejor tener el nohup antes o después del sudo? ¿Cómo sudoobtiene su contraseña cuando la ejecuta nohup?
Aaron Digulla
1
Bueno, ese es un buen punto: no lo hará. Aquí tiene múltiples soluciones: ejecute un comando sudo antes, sudo guardará su contraseña. Esa es la manera rápida y sucia. Otro sería eliminar el &, dar sudola contraseña y luego enviar el proceso a un segundo plano ctrl + z. También puede configurar sudopara no solicitar la contraseña para este usuario específico y esta pareja ejecutable.
(
Normalmente lo hago sudo bash, luego ejecuto el nohupcomando desde el interior del nuevo shell.
En realidad, es incorrecto que si solo usa &el proceso en segundo plano, se eliminará al cerrar sesión. Solo si se mata a bash con un SIGHUP, entonces SIGHUP su programa. Pero cerrar sesión no causa un SIGHUP. Si escribe logouto usa CTRL + D, bash saldrá y dejará el proceso en ejecución. SIGHUP se envía cuando cierra el emulador de terminal en una GUI.
Patrick
2

Boblightd

En el caso de boblightd, la salida enviada a stderr ya está capturada en su archivo de registro (por defecto es ~ / .boblight / boblightd.log ), por lo que no es necesario capturarla y descartarla. Además, boblight no se bifurca de forma predeterminada, pero se puede hacer mediante la inclusión de -f en el comando.

Te sugiero que pruebes lo siguiente:

sudo boblightd -f >/dev/null 2>/dev/null

(detalles de la documentación del proyecto )

Más generalmente

Los procesos iniciados desde el shell finalizarán cuando el shell salga. Como otros han señalado, usar Ctrl-Zmientras se ejecuta un proceso en primer plano devuelve el control al shell. Sin embargo, el proceso se coloca en un estado detenido en este punto. El bg comando será necesario para que el proceso vuelva a ejecutarse, pero permanezca en segundo plano. Requiere una identificación de proceso o el número de trabajo (ya que los números de trabajo habituales tienen el prefijo%), por lo que al usar su segundo ejemplo, emitiría

bg %1

o

bg 2289

El proceso ahora se ejecutará en segundo plano pero aún está conectado al shell. El enlace al shell se puede cortar con el disowncomando, que ahorra la confusión con nohup / sudo. Al igual que con bg, disownsolo requiere la identificación del proceso o el número de trabajo

p.ej

disown 2289

Ahora puede salir del shell de forma segura como si hubiera ejecutado el proceso con el nohupcomando

Chilledrat
fuente
1

Dado que la respuesta ya está más o menos establecida en los comentarios. Sentí que sería bueno publicar un poco de explicación al respecto como una respuesta real.

Entonces el camino a seguir es: sudo boblightd > /dev/null 2>&1 &

Hay 3 partes importantes aquí. Lo más importante es &al final de la línea. Hace que el shell no espere a que finalice el comando antes de devolver el control. También saca la entrada estándar del teclado. Pone el trabajo en segundo plano.

Pero esto aún dejaría la salida nuevamente en la consola. Para evitar esto, hay un >símbolo que redirige la salida estándar ( /dev/nullen este caso).

En este punto, aún puede obtener resultados del comando llamado llegar a la pantalla. Este sería el error estándar. Así que finalmente hay 2>&1magia. Esto redirige la salida del flujo de error estándar a la salida estándar.

2y 1provienen de descriptores de archivos estándar. 0sería stdin, 1- stdout, 2- stderr.

Puede redirigir la salida a un archivo si lo necesita.

Hay comandos diseñados para interactuar con trabajos en segundo plano. jobsy fg.

También puedes jugar con soluciones más avanzadas como el screencomando si es necesario.

luk32
fuente