Comandos de shell asincrónicos

100

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 ...

LorenVS
fuente
2
Relacionado, consulte Diferencia entre nohup, disown y & en Unix y Linux Stack Exchange.
jww
1
Para aquellos que buscan una respuesta más detallada que hable sobre las diferencias entre nohup, &ydisown , haga clic aquí para desplazarse a la cuarta respuesta .
noɥʇʎԀʎzɐɹƆ

Respuestas:

116

Simplemente puede ejecutar el script en segundo plano:

$ myscript &

Tenga en cuenta que esto es diferente de poner el &interior de su secuencia de comandos, que probablemente no hará lo que desea.

Carl Norum
fuente
1
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).
    • Generalmente se usa con &(como trabajo de fondo).
Ani Menon
fuente
No puedo encontrar disownen Debian u OS X. Pensé que era un programa, pero parece que me equivoco. ¿Qué es?
jww
comando disown y en OSX
Ani Menon
6
Esta es la mejor respuesta. Más completo.
noɥʇʎԀʎzɐɹƆ
3
Definitivamente la mejor respuesta, no sé por qué tan poco sube
HeberLZ
1
@VladGanshin No.
Ani Menon
39
nohup cmd

no cuelga cuando cierra la terminal. la salida por defecto va a nohup.out

Puede combinar esto con el fondo,

nohup cmd &

y deshacerse de la salida,

nohup cmd > /dev/null 2>&1 &

también puede disownun comando. tipocmd , Ctrl-Z, bg,disown

Steve B.
fuente
2
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)

pajton
fuente
2
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.

mluthra
fuente
@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.
BuvinJ