Estoy intentando escribir una secuencia de comandos shell de Linux (preferiblemente bash), supuestamente nombrado detach.sh
, para separar con seguridad los programas desde un terminal, tal que:sobre cómo escribir un script de shell de Linux para separar con seguridad los programas desde un terminal
Invocación:
./detach.sh prog [arg1 arg2 ...]
.Es
exec
-able, p. Ej. mediante la ejecución de esto en su shell:exec ./detach.sh prog [arg1 arg2 ...]
Con citando adecuado (principalmente manejo de argumentos que contienen espacios en blanco).
Descarta las salidas (ya que no son necesarias).
No usa
screen
,tmux
, etc. (misma razón con 4, más sin necesidad de un proceso de niñera extra).Usa comandos (razonablemente) portátiles y programas, y nada como
start-stop-daemon
que es bastante específico de la distribución.
he pensado en varias formas (líneas shebang #!/bin/bash
olvidadas en aras de la brevedad):
nohup
:nohup "[email protected]" >& /dev/null &
disown
:"[email protected]" >& /dev/null & disown
setsid
:setsid "[email protected]" >& /dev/null &
Usando una subcapa:
("[email protected]" >& /dev/null &)
nohup
/setsid
combinarse con subcapa:# Or alternatively: # (nohup "[email protected]" >& /dev/null &) (setsid "[email protected]" >& /dev/null &)
Al utilizar gedit
como el programa de prueba (sustituyendo la parte "[email protected]"
), condición 1 se puede satisfacer con todos los métodos anteriores, pero la condición 2 se puede satisfacer con ninguno.
Sin embargo, si un programa arbitrario (pero no una orden interna del shell) son añadidas a la escritura 5, todas las condiciones parecen estar satisfecho (al menos para mí en el caso gedit
). Por ejemplo:
(setsid "[email protected]" >& /dev/null &)
# Not just `true' because it is also a shell builtin.
/bin/true
Cualquier persona con una idea acerca de una explicación de los fenómenos anteriores y cómo implementar correctamente los requisitos?
EDIT:
Con la condición 2, quiero decir que el programa debe ser separado de la terminal, pero corre como siempre lo contrario. Por ejemplo, con el caso gedit
, la condición falla si gedit
simplemente sale inmediatamente después de que el proceso del script ha finalizado.
¿De qué manera solución al 5 no cumple con el requisito 2, suponiendo que tiene el tinglado ? O, aproximadamente de manera equivalente, ¿qué significa el requisito 2 que la solución 5 no lo satisface? –
¿Qué espera que suceda cuando 'gedit' se ejecute en segundo plano? Dado que 'gedit' es un editor que se ejecuta de forma interactiva, pero un proceso en segundo plano es, más o menos por definición, algo que se ejecuta sin interacción del usuario, tal vez el problema es su elección de programa de prueba. Manejar programas basados en X11 es bastante diferente de manejar compiladores y similares. ¿Qué ves que sucede cuando ejecutas 'gedit' en segundo plano? –
Perdón por la explicación incorrecta de mi idea. Quise decir "separar" cuando decía "fondo". Por favor vea la versión actualizada de esta pregunta. Gracias por su ayuda :) –