Copiei um trecho de Bash para segundo plano um comando ssh executado remotamente:
ssh user@remote <<CMD
some process <&- >log 2>error &
CMD
O que <&-
faz?
Meu palpite é que é o mesmo que< /dev/null
Minha próxima entendimento é que os três principais descritores de arquivos ( stdin
, stdout
, stderr
) precisam ser fechados para evitar:
- O trabalho que está sendo realizado em segundo plano e o script saindo - conflitante de alguma forma?
- Quando o terminal é fechado, todos os processos que estão aceitando stdin do terminal são fechados?
bash
shell
io-redirection
Eric Francis
fonte
fonte
ssh -nNT user@remote 'command'
criará uma sessão SSH não interativa. Acrescente-o&
ao segundo plano, anexenohup
-ocommand
ao para mantê-lo em execução se a sua conexão acabar.man ssh
sugere que -N desabilite a execução de um comando remoto por completo, e um teste rápido suporta isso.Respostas:
<&-
não é exatamente a mesma coisa que< /dev/null
.<&-
fecha fd 0, enquanto o< /dev/null
redireciona do dispositivo/dev/null
, que nunca fornece dados e sempre fornece EOF na leitura. A diferença é principalmente que umaread(2)
chamada de um FD fechado (o<&-
caso) apresentará um erro no EBADF, enquanto uma chamada de um FD redirecionado a nulo não retornará bytes lidos (condição de fim de arquivo). Se o seu programa nunca lê a partir de stdin, a distinção não importa.Fechar os FDs é uma boa prática se você estiver em segundo plano, pois um processo em segundo plano será interrompido se tentar ler algo do TTY. Este exemplo não lida completamente com tudo o que deveria; idealmente, haveria
nohup
ousetsid
invocação em algum lugar para desassociar completamente o processo em segundo plano.fonte
nohup
além de fechar os descritores de arquivo?setsid some process <&- >path/to/log 2>path/to/error
. O método mais rápido é algo parecidonohup some process &
.nohup
não faz sentido aqui.nohup
impedir que o processo recebaHUP
sinal quando seu terminal de controle estiver fechado. Mas você não tinha nenhum terminal neste caso.Veja
man bash
:fonte
[n]<&word
e a palavra contém mais de um único dígito.man bash
incorreto?bash
decide implementá-lo de maneira sã (para alguma definição adequada de "sã"). Outras conchas podem ou não fazê-lo.bash
, nãoposix-shell
.<&-
feche a entrada padrão.A forma geral, definida pelo POSIX , é:
Seu objetivo de criar descritor de arquivo
n
é uma cópia do descritor de arquivo indicado porword
. A entrada padrão é assumida sen
for omitida e seword
for-
, o descritor de arquivon
será fechado.Não é o mesmo que
</dev/null
, desde quando, no caso de</dev/null
, a entrada padrão ainda estava aberta e foi redirecionada para outro local.Você precisa fechar todos os descritores de arquivo dos processos anexados ao soquete ssh, caso contrário, a sessão ssh não poderá ser fechada.
Você pode executar o comando na máquina remota sem anexá-lo à sessão ssh, usando screen ou tmux :
fonte