Quando executo no linux-system/bash:
sleep 10 &
Recebo o prompt do bash imediatamente.
Mas quando eu corro:
ssh linux-system 'sleep 10 &'
Espero 10 segundos.
Duas questões:
Posso encontrar explicações na documentação do ssh/bash?
Ao alterar o contexto/configuração, podemos fazer com que o ssh retorne imediatamente, sem alterar o comando
sleep 10 &
em si? por exemplo :
ssh linux-system 'change-bash-configuration; sleep 10 &'
ou
ssh -some-ssh-options linux-system 'sleep 10 &'
Atualização 1
Podemos usar ssh -f
para obter o prompt, mas um ssh
processo em segundo plano ainda aguarda a conclusão do processo remoto. Portanto, minhas perguntas permanecem.
Atualização 2
Para esclarecer, quero que ssh
o processo local termine (sem esperar 10 segundos em segundo plano) após iniciar o trabalho remoto em segundo plano.
O comportamento é o mesmo, na verdade. O que acontece é que você está enviando o comando
sleep
para background na máquina remota , mas não está enviando ossh
comando para background na sua máquina local. Portanto, a máquina local aguarda ossh
término essh
espera osleep
término.Se quiser recuperar seu prompt local imediatamente, você pode enviar
ssh
para segundo plano:No entanto, isso provavelmente causará outro problema ; portanto, se esse for o comportamento que você deseja, use
-f
:Ou certifique-se de que nenhuma entrada vá para o
ssh
comando do terminal comSe quiser que o comando continue no servidor remoto, mesmo se você fechar o terminal local, você pode usar
nohup
:ou
Quanto ao local onde isso está documentado, é improvável que seja mencionado explicitamente, este não é um recurso especial nem nada, é simplesmente que sua versão original não estava enviando o arquivo
ssh
para segundo plano.De acordo com a página de manual do ssh
A razão pela qual o ssh não sai imediatamente é porque o comando remoto ainda tem stdin, stdout, stderr abertos. Se você fechá-los, ele deverá retornar imediatamente.
Isso substitui stdin, stdout e stderr para suspensão. Bash ainda os tem abertos. Mas como o sleep agora está em segundo plano, já que este não é um shell bash interativo, ele deixa o bash sem mais nada para fazer e sai, fechando as conexões que o sshd remoto forneceu para stdin, stdout e stderr. Como nesse ponto não há conexões abertas para ssh, ele pode fechar a sessão ssh e sair.
Para estender um pouco este exemplo, se você executou
então o ssh estabeleceria um túnel X11 através do qual o xclock abriria uma conexão. (O sono é necessário para dar tempo ao xclock para iniciar antes da saída do bash.) O Bash então sairia, mas a conexão X11 persistiria e o ssh não sairia. Se você matasse o ssh, o xclock perderia a conexão através do túnel e a janela fecharia. Se, em vez disso, você fechar ou encerrar a própria janela do xclock, o xclock fechará a conexão X11 e, como essa é a última conexão, o ssh sairá.