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


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.


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

No puedo encontrar disownen Debian u OS X. Pensé que era un programa, pero parece que me equivoco. ¿Qué es?
jww


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


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)


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.


@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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.