Esta é uma pergunta subsequente para Como você usa ssh em um script de shell? questão. Se eu quiser executar um comando na máquina remota que é executado em segundo plano nessa máquina, como faço para que o comando ssh retorne? Quando tento incluir apenas o e comercial (&) no final do comando, ele simplesmente trava. A forma exata do comando é semelhante a esta:
ssh user@target "cd /some/directory; program-to-execute &"
Alguma ideia? Uma coisa a observar é que os logons na máquina de destino sempre produzem um banner de texto e eu tenho chaves SSH configuradas para que nenhuma senha seja necessária.
/dev/null
.< /dev/null
significa? Obrigado.Esta tem sido a maneira mais limpa de fazer isso por mim: -
A única coisa que corre depois disso é o comando real na máquina remota
fonte
-n
não é necessário, pois-f
implica-n
ssh -f
deixa o processo ssh conectado, apenas em segundo plano. As soluções / dev / null permitem que o ssh se desconecte rapidamente, o que pode ser preferível.Redirecionar fd's
A saída precisa ser redirecionada com a
&>/dev/null
qual redireciona stderr e stdout para / dev / null e é sinônimo de>/dev/null 2>/dev/null
or>/dev/null 2>&1
.Parantheses
A melhor maneira é usar
sh -c '( ( command ) & )'
where command é qualquer coisa.Nohup Shell
Você também pode usar nohup diretamente para iniciar o shell:
Nice Launch
Outro truque é usar nice para iniciar o comando / shell:
fonte
nohup
faz e por que e quando você usarianice
? Eu acho que isso acrescentaria muito a essa resposta.Se você não conseguir / não conseguir manter a conexão aberta, poderá usar a tela , se tiver os direitos para instalá-la.
Para desanexar a sessão da tela: ctrl-a d
Para listar sessões de tela:
Para anexar novamente uma sessão:
Observe que a tela também pode criar vários shells dentro de cada sessão. Um efeito semelhante pode ser alcançado com o tmux .
Para desanexar a sessão tmux: ctrl-b d
Para listar sessões de tela:
Para anexar novamente uma sessão:
A chave de controle padrão do tmux, ' ctrl-b', é um pouco difícil de usar, mas existem vários exemplos de configurações do tmux que acompanham o tmux que você pode tentar.
fonte
screen
isso?Eu só queria mostrar um exemplo de trabalho que você pode cortar e colar:
fonte
A maneira mais rápida e fácil é usar o comando 'at':
fonte
at
argumentos de linha de comando aceitos fossem aceitos após o tempo e não apenas em um arquivo.Acho que você terá que combinar algumas dessas respostas para obter o que deseja. Se você usar nohup em conjunto com o ponto-e-vírgula e agrupar tudo entre aspas, obterá:
o que parece funcionar para mim. Com nohup, você não precisa anexar o & ao comando a ser executado. Além disso, se você não precisar ler nenhuma das saídas do comando, poderá usar
para redirecionar toda a saída para / dev / null.
fonte
Isso funcionou para mim algumas vezes:
fonte
Você pode fazer assim ...
fonte
Na verdade, sempre que preciso executar um comando em uma máquina remota complicada, gosto de colocar o comando em um script na máquina de destino e apenas executá-lo usando o ssh.
Por exemplo:
E então eu apenas executei este comando na máquina de origem:
fonte
Eu estava tentando fazer a mesma coisa, mas com a complexidade adicional que eu estava tentando fazer isso a partir do Java. Então, em uma máquina executando java, eu estava tentando executar um script em outra máquina, em segundo plano (com nohup).
Na linha de comando, aqui está o que funcionou: (você pode não precisar do "-i keyFile" se não precisar dele para ssh no host)
Observe que, na minha linha de comando, há um argumento após o "-c", que é todo entre aspas. Mas para que funcione do outro lado, ele ainda precisa das aspas, então eu tive que colocar aspas escapadas dentro dela.
De java, aqui está o que funcionou:
Demorou um pouco de tentativa e erro para fazer isso funcionar, mas parece funcionar bem agora.
fonte
Pareceu-me bastante conveniente ter uma sessão remota do tmux usando a
tmux new -d <shell cmd>
sintaxe como esta:Isso iniciará uma nova sessão no
elsewhere
host e o comando ssh na máquina local retornará ao shell quase instantaneamente. Você pode então ssh no host remoto etmux attach
nessa sessão. Observe que não há nada sobre o tmux local em execução, apenas remoto!Além disso, se você deseja que sua sessão persista após a conclusão do trabalho, basta adicionar um iniciador de shell após seu comando, mas não se esqueça de colocar aspas:
fonte
Isso deve executar o comando e atribuir uma identificação de processo. Você pode simplesmente tail -f YOUR-LOG.log para ver os resultados gravados nele à medida que ocorrem. você pode sair a qualquer momento e o processo continuará
fonte
Você pode fazer isso sem nohup:
fonte
Eu acho que é isso que você precisa: Primeiro você precisa instalar
sshpass
na sua máquina. então você pode escrever seu próprio script:fonte
Primeiro, siga este procedimento:
Efetue login em A como usuário a e gere um par de chaves de autenticação. Não digite uma senha:
Agora use ssh para criar um diretório ~ / .ssh como usuário b em B. (O diretório já pode existir, o que é bom):
Finalmente, adicione a nova chave pública de a em b @ B: .ssh / allowed_keys e digite a senha de b uma última vez:
A partir de agora, você pode fazer login em B como b e em A como a sem senha:
então isso funcionará sem digitar uma senha
ssh b @ B "cd / some / directory; programa para executar &"
fonte