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
shell
sudo
background-process
usuario2534685
fuente
fuente
sudo boblightd > /dev/null 2>&1 &
dmenu
. Es simple y hace el trabajo bastante bien.Respuestas:
El
[1] 2289
comando 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:
Si desea que stdout y stderr vayan al mismo archivo:
Y, por supuesto, si no le importa la salida de una o ambas secuencias, puede enviar a en
/dev/null
lugar de un nombre de archivo.(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
sudo
que no solicitará una contraseña y que no cerrará la ventana del terminal. Para el primero, personalmente uso normalmentesudo bash
, escribiríaboblightd >std.txt 2>err.txt &
. Otra forma es hacersudo ls
o algún comando inofensivo para asegurarse de que el acceso se almacena en caché.Para este último,
nohup
es el comando mágico para asegurarse de que siga funcionando incluso después de salir del edificio. Iría después delsudo
y antes del comando real. Por ejsudo nohup boblightd >std.txt 2>err.txt &
. Osudo bash
entoncesnohup boblightd >std.txt 2>err.txt &
, entoncesexit
(para salir del shell de raíz).fuente
sudo
intenta solicitar la contraseña, fallará porque los procesos en segundo plano no pueden leer STDIN.Creo que puedes usar un comando nohup como este:
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:
luego ejecuta tu comando:
Para guardar la pantalla y volver al terminal, escriba Ctrl+AD( Ctrl+Aes la pista para la
screen
que desea hacer algo y Dluego "d" etaches de la sesión sin detenerlo).restaurar su pantalla:
fuente
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 elnohup
comando para evitar esto:nohup sudo boblightd > boblight.out 2> boblight.err < /dev/null &
Tenga en cuenta que
sudo
probablemente 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:sudo
comando antes,sudo
guardará su contraseña. Esa es la manera rápida y sucia.&
, proporcionesudo
la contraseña, luego envíe el proceso a segundo plano con CTRL + Z.fuente
sudo
? ¿Cómosudo
obtiene su contraseña cuando la ejecutanohup
?&
, darsudo
la contraseña y luego enviar el proceso a un segundo planoctrl + z
. También puede configurarsudo
para no solicitar la contraseña para este usuario específico y esta pareja ejecutable.sudo bash
, luego ejecuto elnohup
comando desde el interior del nuevo shell.&
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 escribelogout
o 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.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:
(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íao
El proceso ahora se ejecutará en segundo plano pero aún está conectado al shell. El enlace al shell se puede cortar con el
disown
comando, que ahorra la confusión con nohup / sudo. Al igual que conbg
,disown
solo requiere la identificación del proceso o el número de trabajop.ej
Ahora puede salir del shell de forma segura como si hubiera ejecutado el proceso con el
nohup
comandofuente
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/null
en 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>&1
magia. Esto redirige la salida del flujo de error estándar a la salida estándar.2
y1
provienen de descriptores de archivos estándar.0
seríastdin
,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.
jobs
yfg
.También puedes jugar con soluciones más avanzadas como el
screen
comando si es necesario.fuente