Copié un fragmento de Bash para poner en segundo plano un comando ssh ejecutado de forma remota:
ssh user@remote <<CMD
some process <&- >log 2>error &
CMD
¿Qué <&-
hacer?
Supongo que es lo mismo que< /dev/null
Mi siguiente entendimiento es que los tres descriptores de archivos principales ( stdin
, stdout
, stderr
) deben ser cerradas para impedir:
- El trabajo está en segundo plano y la secuencia de comandos sale, ¿conflictiva de alguna manera?
- Cuando el terminal se cierra, ¿se cierran todos los procesos que aceptan stdin del terminal?
bash
shell
io-redirection
Eric Francis
fuente
fuente
ssh -nNT user@remote 'command'
creará una sesión SSH no interactiva. Agregue&
al fondo, anteponganohup
alcommand
para mantenerlo en funcionamiento si su conexión se corta.man ssh
sugiere que -N deshabilita la ejecución de un comando remoto por completo, y una prueba rápida lo respalda.Respuestas:
<&-
no es exactamente lo mismo que< /dev/null
.<&-
cierra fd 0, mientras que lo< /dev/null
redirige desde el dispositivo/dev/null
, que nunca proporciona datos y siempre da EOF en la lectura. La diferencia es principalmente que unaread(2)
llamada de un FD cerrado (el<&-
caso) producirá un error con EBADF, mientras que una llamada de un FD redirigido nulo no devolverá bytes leídos (condición de fin de archivo). Si su programa nunca lee de stdin, la distinción no importa.Cerrar los FD es una buena práctica si está haciendo algo en segundo plano, ya que un proceso en segundo plano se bloqueará si intenta leer algo de TTY. Sin embargo, este ejemplo no maneja completamente todo lo que debería; idealmente habría una
nohup
osetsid
invocación en alguna parte, para desasociar completamente el proceso en segundo plano.fuente
nohup
además de cerrar los descriptores de archivo?setsid some process <&- >path/to/log 2>path/to/error
. El método más rápido es algo asínohup some process &
.nohup
no tiene sentido aquí.nohup
evitar que el proceso recibaHUP
señal cuando se cierra su terminal de control. Pero no tenías ninguna terminal en este caso.Ver
man bash
:fuente
[n]<&word
y la palabra contiene más de un solo dígito.man bash
incorrecto?bash
elige implementarlo de una manera sensata (para alguna definición adecuada de "sano"). Otros depósitos pueden o no hacerlo.bash
, noposix-shell
.<&-
Cerrar entrada estándar.La forma general, definida por POSIX , es:
Su propósito de hacer un descriptor de archivo
n
es una copia del descriptor de archivo denotado porword
. Se supone estándar en sin
se omite, y siword
es así-
, el descriptor de archivon
se cerrará.No es lo mismo que
</dev/null
, ya que en caso de</dev/null
, la entrada estándar todavía se abrió y se redirigió a otro lugar.Debe cerrar todos los descriptores de archivos de los procesos que se adjuntaron al socket ssh, de lo contrario, la sesión ssh no se puede cerrar.
Puede ejecutar el comando en una máquina remota sin adjuntarlo a la sesión ssh, usando screen o tmux :
fuente