Estoy tratando de usar un script de shell para iniciar un comando. No me importa si / cuándo / cómo / por qué termina. Quiero que el proceso se inicie y se ejecute, pero quiero poder volver a mi shell inmediatamente ...
Sabía que iba a ser algo fácil, muchas gracias ... Linux no es lo mío, pero estoy tratando de ponerme al día ... Por cierto, ¿funcionará esto cuando se combine con nohup?
LorenVS
2
¿Cuál es la diferencia entre poner & en la línea de comando y ponerlo en el script? No sabía que eran diferentes.
Jacob Sharf
8
@JacobSharf, pruébalo y verás. Si &está dentro de la secuencia de comandos y no tiene una wait, el comando en segundo plano se eliminará cuando finalice la secuencia de comandos.
Carl Norum
Oh. Eso explica mucho. Recientemente noté algún efecto que sería causado por eso. Buscarlo en Google me llevó a esta página. Gracias
Jacob Sharf
Si myscriptmodifica el entorno de la terminal, ej. Es un comando de inicialización de terminal que no se necesita de inmediato y puede retrasarse, ¿seguirá modificando el entorno de la terminal?
noɥʇʎԀʎzɐɹƆ
58
Todos simplemente se olvidaron disown. Entonces aquí hay un resumen:
& pone el trabajo en segundo plano.
Hace que se bloquee al intentar leer la entrada, y
Hace que el caparazón no espere a que se complete.
disown elimina el proceso del control de trabajo del shell, pero aún lo deja conectado a la terminal.
Uno de los resultados es que el shell no le enviará un SIGHUP(si el shell recibe un SIGHUP, también envía un SIGHUPal proceso, lo que normalmente hace que el proceso termine).
Y, obviamente, solo se puede aplicar a trabajos en segundo plano (porque no puede ingresarlo cuando se está ejecutando un trabajo en primer plano).
nohupdesconecta el proceso del terminal, redirige su salida nohup.outy lo protege de SIGHUP.
El proceso no recibirá ningún envío SIGHUP.
Es completamente independiente del control del trabajo y, en principio, podría usarse también para trabajos en primer plano (aunque eso no es muy útil).
Genial, loco cómo se combina todo, creo que el pedido me afectaría al principio, pero supongo que podrías memorizarlo (lo que escribiste o "nohup cmd &> / dev / null 2> & 1" :))
LorenVS
Me encontré con esto esta noche. He estado luchando con un script de shell durante 2 días y esta sugerencia hizo que todo funcionara. ¡Muchas gracias!
JD Long
Genial, esto es muy útil. Cuando se ejecuta en modo de fondo, puede verificar la salida del comando de vez en cuando usando tail nohup.out, esto mostrará las últimas 10 líneas de la salida del comando. Lo uso para trabajos de copia de seguridad de rsync para ver en qué archivo se encuentra actualmente.
Martin Hansen
¿Qué pasa si hago esto, pero quiero detener el proceso en segundo plano?
Stephan Bijzitter
El shell imprime un identificador de trabajo cuando inicia un trabajo precisamente para este propósito. Puede ver sus trabajos en ejecución en cualquier momento con jobs.
tripleee
26
Alternativamente, después de ejecutar el programa, puede presionar Ctrl-Z que detiene su programa y luego escribir
bg
que pone su último programa detenido en segundo plano. (Útil si comenzó algo sin '&' y aún lo quiere en segundo plano sin reiniciarlo)
Gracias, ese es un pequeño truco genial ... Empezando a apreciar realmente algunas de las bondades del caparazón ...
LorenVS
3
screen -m -d $command$inicia el comando en una sesión separada. Puede utilizar screen -rpara adjuntar a la sesión iniciada. Es una herramienta maravillosa, extremadamente útil también para sesiones remotas. Leer más en man screen.
@LadenkovVladislav Estoy 95% seguro de que puedes instalar la pantalla en RedHat. Tengo en CentOS.
BuvinJ
En Ubuntu, quería emular el comando de "inicio" de Windows / batch. Es decir, inicie de forma asincrónica un programa en primer plano (gui) y continúe a través de un script de shell. Esto hace exactamente eso.
nohup
,&
ydisown
, haga clic aquí para desplazarse a la cuarta respuesta .Respuestas:
Simplemente puede ejecutar el script en segundo plano:
Tenga en cuenta que esto es diferente de poner el
&
interior de su secuencia de comandos, que probablemente no hará lo que desea.fuente
&
está dentro de la secuencia de comandos y no tiene unawait
, el comando en segundo plano se eliminará cuando finalice la secuencia de comandos.myscript
modifica el entorno de la terminal, ej. Es un comando de inicialización de terminal que no se necesita de inmediato y puede retrasarse, ¿seguirá modificando el entorno de la terminal?Todos simplemente se olvidaron
disown
. Entonces aquí hay un resumen:&
pone el trabajo en segundo plano.disown
elimina el proceso del control de trabajo del shell, pero aún lo deja conectado a la terminal.SIGHUP
(si el shell recibe unSIGHUP
, también envía unSIGHUP
al proceso, lo que normalmente hace que el proceso termine).nohup
desconecta el proceso del terminal, redirige su salidanohup.out
y lo protege deSIGHUP
.SIGHUP
.&
(como trabajo de fondo).fuente
disown
en Debian u OS X. Pensé que era un programa, pero parece que me equivoco. ¿Qué es?no cuelga cuando cierra la terminal. la salida por defecto va a nohup.out
Puede combinar esto con el fondo,
y deshacerse de la salida,
también puede
disown
un comando. tipocmd
,Ctrl-Z
,bg
,disown
fuente
tail nohup.out
, esto mostrará las últimas 10 líneas de la salida del comando. Lo uso para trabajos de copia de seguridad de rsync para ver en qué archivo se encuentra actualmente.jobs
.Alternativamente, después de ejecutar el programa, puede presionar Ctrl-Z que detiene su programa y luego escribir
que pone su último programa detenido en segundo plano. (Útil si comenzó algo sin '&' y aún lo quiere en segundo plano sin reiniciarlo)
fuente
screen -m -d $command$
inicia el comando en una sesión separada. Puede utilizarscreen -r
para adjuntar a la sesión iniciada. Es una herramienta maravillosa, extremadamente útil también para sesiones remotas. Leer más enman screen
.fuente