Utilizo Tilda (terminal desplegable) en Ubuntu como mi "central de comandos", más o menos de la misma manera que otros podrían usar GNOME Do, Quicksilver o Launchy.
Sin embargo, estoy luchando con cómo separar completamente un proceso (por ejemplo, Firefox) del terminal desde el que se inició, es decir, evitar que dicho proceso (no) secundario
- se termina al cerrar el terminal de origen
- "contamina" el terminal de origen a través de STDOUT / STDERR
Por ejemplo, para iniciar Vim en una ventana de terminal "adecuada", probé un script simple como el siguiente:
exec gnome-terminal -e "vim $@" &> /dev/null &
Sin embargo, eso todavía causa contaminación (además, pasar un nombre de archivo no parece funcionar).
Respuestas:
Ante todo; una vez que haya comenzado un proceso, puede ponerlo en segundo plano deteniéndolo primero (presionar Ctrl- Z) y luego escribiendo
bg
para permitir que se reanude en segundo plano. Ahora es un "trabajo", y sustdout
/stderr
/stdin
aún está conectado a su terminal.Puede iniciar un proceso como fondo inmediatamente agregando un "&" al final del mismo:
Para ejecutarlo en segundo plano silenciado, use esto:
Alguna información adicional:
nohup
es un programa que puede usar para ejecutar su aplicación de tal manera que su stdout / stderr se pueda enviar a un archivo y que cerrar el script principal no haga SIGHUP al hijo. Sin embargo, debe haber tenido la previsión de haberlo usado antes de iniciar la aplicación. Debido a la forma en quenohup
funciona, no puede simplemente aplicarlo a un proceso en ejecución .disown
es un bash incorporado que elimina un trabajo de shell de la lista de trabajos del shell. Lo que esto básicamente significa es que ya no puedes usarlofg
,bg
pero lo más importante es que cuando cierras tu shell ya no se cuelga ni envía un mensajeSIGHUP
a ese niño. A diferencianohup
,disown
se usa después de que el proceso se ha iniciado y se ha establecido en segundo plano.Lo que no puede hacer es cambiar el stdout / stderr / stdin de un proceso después de haberlo lanzado. Al menos no desde la cáscara. Si inicia su proceso y le dice que su stdout es su terminal (que es lo que hace por defecto), entonces ese proceso está configurado para salir a su terminal. Su shell no tiene nada que ver con la configuración FD de los procesos, eso es puramente algo que el proceso en sí mismo administra. El proceso en sí mismo puede decidir si cierra su stdout / stderr / stdin o no, pero no puede usar su shell para forzarlo a hacerlo.
Para administrar la salida de un proceso en segundo plano, tiene muchas opciones de scripts, "nohup" probablemente sea el primero en pensar. Pero para los procesos interactivos que comienzas pero olvidaste silenciar (
firefox < /dev/null &>/dev/null &
) no puedes hacer mucho, realmente.Te recomiendo que obtengas GNU
screen
. Con la pantalla, puede cerrar su shell en ejecución cuando la salida del proceso se vuelve molesta y abrir una nueva (^Ac
).Ah, y por cierto, no uses "
$@
" donde lo estás usando.$@
significa,$1
,$2
,$3
..., lo que convertiría a su comando en:Probablemente eso no sea lo que quieres porque solo toma un argumento. Use
$1
para mostrar que su script solo puede manejar un argumento.Es realmente difícil hacer que varios argumentos funcionen correctamente en el escenario que proporcionó (con el
gnome-terminal -e
) porque-e
solo toma un argumento, que es una cadena de comando de shell. Tendría que codificar sus argumentos en uno. La mejor y más robusta, pero bastante turbia, es así:fuente
disown
, luego el proceso seguirá vivo después de que cierre el shell, ya que bash ya no lo HUP.$*
lugar de$@
solucionar el problema de las cadenas separadas ya?reptyr
para esto.nohup
separa el proceso por completo (lo demoniza)fuente
nohup
Solo ignora laSIGHUP
señal. Ejecuta el proceso normalmente. Sin demonización.init
) si el caparazón saliera ... ¿verdad?Si está usando
bash
, intente ; ver bash (1) .disown [jobspec]
Otro enfoque que puedes probar es
at now
. Si no eres superusuario, tu permiso de usoat
puede estar restringido.fuente
at
delegar la ejecución a otra persona, ¡me gusta! +1zsh
.disown
no parece tener el efecto deseado congnome-terminal
-disown
ed procesos todavía son asesinados al salir del terminal. Me encantaría saber por qué / cómo.Al leer estas respuestas, tuve la impresión inicial de que emitir
nohup <command> &
sería suficiente. Al ejecutar zsh en gnome-terminal, descubrí quenohup <command> &
no evitaba que mi shell matara los procesos secundarios al salir. Aunquenohup
es útil, especialmente con shells no interactivos, solo garantiza este comportamiento si el proceso secundario no restablece su controlador para laSIGHUP
señal.En mi caso,
nohup
debería haber evitado que las señales de bloqueo lleguen a la aplicación, pero la aplicación secundaria (VMWare Player en este caso) estaba restableciendo suSIGHUP
controlador. Como resultado, cuando el emulador de terminal se cierra, aún podría matar sus subprocesos. Esto solo se puede resolver, que yo sepa, asegurando que el proceso se elimine de la tabla de trabajos del shell. Sinohup
se reemplaza con un caparazón incorporado, como a veces es el caso, esto puede ser suficiente, sin embargo, en el caso de que no sea ...disown
se builtin una concha enbash
,zsh
yksh93
,o
si prefieres frases sencillas. Esto tiene el efecto generalmente deseable de eliminar el subproceso de la tabla de trabajos. Esto le permite salir del emulador de terminal sin indicar accidentalmente el proceso secundario. No importa cómo se
SIGHUP
vea el controlador, esto no debería matar el proceso de su hijo.Después del rechazo, el proceso sigue siendo un elemento secundario de su emulador de terminal (juegue
pstree
si desea ver esto en acción), pero después de que el emulador de terminal se cierre, debería verlo adjunto al proceso de inicio. En otras palabras, todo es como debería ser, y como presumiblemente quiere que sea.¿Qué hacer si su shell no es compatible
disown
? Recomiendo encarecidamente cambiar a uno que sí lo haga, pero en ausencia de esa opción, tiene algunas opciones.screen
ytmux
puede resolver este problema, pero son soluciones mucho más pesadas, y no me gusta tener que ejecutarlas para una tarea tan simple. Son mucho más adecuados para situaciones en las que desea mantener un tty, generalmente en una máquina remota.setopt nohup
. Esto se puede usar para especificar queSIGHUP
no se debe enviar a los trabajos en la tabla de trabajos cuando se cierra el shell. Puede aplicar esto justo antes de salir del shell, o agregarlo a la configuración del shell como~/.zshrc
si siempre lo quisiera.tcsh
ocsh
, lo cual es algo inquietante.exec()
. Esta es una solución muy pobre, pero la fuente solo debe consistir en un par de docenas de líneas. Luego puede pasar comandos como argumentos de línea de comandos al programa C, y así evitar una entrada específica del proceso en la tabla de trabajos.fuente
nohup $COMMAND &
$COMMAND & disown
setsid command
He estado usando el número 2 durante mucho tiempo, pero el número 3 funciona igual de bien. Además,
disown
tiene unnohup
indicador de-h
, puede rechazar todos los procesos-a
y puede rechazar todos los procesos en ejecución con-ar
.El silencio se logra por
$COMMAND &>/dev/null
.¡Espero que esto ayude!
fuente
Creo que la pantalla podría resolver tu problema
fuente
en tcsh (y quizás también en otros shells), puede usar paréntesis para separar el proceso.
Compara esto:
A esto:
Esto elimina Firefox de la lista de trabajos, pero aún está vinculado al terminal; si ha iniciado sesión en este nodo a través de 'ssh', al intentar cerrar la sesión, el proceso ssh se bloqueará.
fuente
La respuesta más simple y correcta para bash:
No tiene que separar el proceso del terminal, sino del shell.
fuente
Para desasociar tty shell, ejecute el comando a través de un sub-shell para
(mando)&
Cuando la salida utiliza el terminal cerrado, pero el proceso aún está vivo.
cheque -
Abrir otra terminal
El proceso aún está vivo.
fuente
Hacer un segundo plano y poner en primer plano un trabajo es probablemente una de las primeras cosas que todo administrador de sistemas Unix debe saber.
Así es como se hace con bash:
fuente
Puede ejecutar su comando usando el comando nohup, esto separa su proceso y redirige las salidas a un archivo determinado ... pero no estoy seguro de que eso sea exactamente lo que necesita ...
fuente
Pruebe el demonio : debe estar disponible a través de su amigable administrador de paquetes y debe ocuparse de todas las formas de desasociarse del terminal.
fuente
Simplemente agregue esto en su bashrc / zshrc:
Luego puede ejecutar comandos rechazados como este:
fuente
En mi .bashrc, tengo estas funciones precisamente para ese propósito:
Prefije un comando con
dos
para ejecutarlo desconectado de la terminal.La función está escrita para trabajar con
bash
yzsh
.fuente
( "$@" & disown) &> /dev/null
. Tampoco tiene mucho sentido usar1>
y2>
, porque lo estás usandodisown
, lo que significa que estás usando bash, y en bash puedes hacer fácilmente&>
para redirigir tanto stdout como stderrrun_disowned
funcionalidad en otros lugares en mis archivos de puntos. Tienes razón sobre el&>
asunto, por supuesto.En Mac OS X, descubrí que necesito usar nohup AND disown para asegurarme de que el proceso secundario no se derribe con el terminal.
fuente
Yo uso el siguiente script para hacer esto. Detiene el proceso de impresión en el terminal, se desconecta
nohup
y sale con el estado de retorno si el comando finaliza dentro delTIMEOUT
.Ejemplo de uso:
fuente
sudo apt install ucommon-utils
pdetach command
Ahí tienes :)
fuente
Muchas respuestas sugirieron usar nohup . Prefiero sugerir el uso de pm2 . Usar pm2 sobre nohup tiene muchas ventajas, como mantener viva la aplicación, mantener archivos de registro para la aplicación y muchas otras características más. Para más detalles mira esto .
Para instalar pm2 necesitas descargar npm . Para el sistema basado en Debian
y para Redhat
O puedes seguir estas instrucciones . Después de instalar npm, úselo para instalar pm2
Una vez hecho esto, puede iniciar su aplicación
Para la supervisión del proceso, utilice los siguientes comandos:
Administre los procesos utilizando el nombre de la aplicación o la identificación del proceso o administre todos los procesos juntos:
Los archivos de registro se pueden encontrar en
fuente
nohup
es un simple comando POSIX estándar, así que el mismo comentario: de ninguna manera está en desuso. @ver unix.com/man-page/posix/1p/nohupSi su objetivo es simplemente iniciar una aplicación de línea de comandos sin mantener la ventana del terminal, entonces puede intentar ejecutar la aplicación después de iniciar el terminal con alt-F2.
fuente