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, anteponganohupalcommandpara mantenerlo en funcionamiento si su conexión se corta.man sshsugiere 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/nullredirige 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
nohuposetsidinvocación en alguna parte, para desasociar completamente el proceso en segundo plano.fuente
nohupademá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 &.nohupno tiene sentido aquí.nohupevitar que el proceso recibaHUPseñal cuando se cierra su terminal de control. Pero no tenías ninguna terminal en este caso.Ver
man bash:fuente
[n]<&wordy la palabra contiene más de un solo dígito.man bashincorrecto?bashelige 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
nes una copia del descriptor de archivo denotado porword. Se supone estándar en sinse omite, y siwordes así-, el descriptor de archivonse 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