Estou trabalhando em uma máquina Linux através do SSH (Putty). Eu preciso deixar um processo em execução durante a noite, para poder fazer isso iniciando o processo em segundo plano (com um e comercial no final do comando) e redirecionando o stdout para um arquivo.
Para minha surpresa, isso não funciona. Assim que fecho a janela Putty, o processo é interrompido.
Como posso impedir que isso aconteça ??
linux
process
ssh
background-process
Liberta-te
fonte
fonte
nohup command > /dev/null 2>&1 &
para ser executado em segundo plano, sem criar qualquer stdout ou stderr saída (nãonohup.out
arquivo)nohup
não ajuda neste caso. Existe uma maneira de mexer comCtrl+Z
/bg
?Eu recomendaria o uso do GNU Screen . Ele permite que você se desconecte do servidor enquanto todos os seus processos continuam em execução. Não sei como vivi sem ela antes de saber que existia.
fonte
Quando a sessão é fechada, o processo recebe o sinal SIGHUP que aparentemente não está captando. Você pode usar o
nohup
comando ao iniciar o processo ou o comando interno do bashdisown -h
após iniciar o processo para impedir que isso aconteça:fonte
daemonize? nohup? TELA? (tmux ftw, a tela é lixo ;-)
Faça o que todos os outros aplicativos fizeram desde o início - garfo duplo.
Bang! Concluído :-) Eu usei isso inúmeras vezes em todos os tipos de aplicativos e em muitas máquinas antigas. Você pode combinar com redirecionamentos e outros enfeites para abrir um canal privado entre você e o processo.
Crie como coproc.sh:
e depois
E lá vai você, desovar o que for. o <(:) abre um canal anônimo por meio da substituição do processo, que morre, mas o canal permanece porque você tem um identificador para ele. Eu costumo fazer um em
sleep 1
vez de,:
porque é um pouco atrevido, e eu recebia um erro "arquivo ocupado" - nunca acontece se um comando real for executado (por exemplo,command true
)"fornecimento de heredoc":
Isso funciona em todos os shell que eu já tentei, incluindo o busybox / etc (initramfs). Eu nunca tinha visto isso antes, eu o descobri independentemente enquanto cutucava, quem sabia que a fonte podia aceitar argumentos? Mas geralmente serve como uma forma de avaliação muito mais gerenciável, se houver algo assim.
fonte
ssh myhost "((exec sleep 500)&) >/dev/null"
ssh myhost 'sleep 500 >&- 2>&- <&- &'
TMTOWTDI;)Substitua o nome do processo por blá!
fonte
Pessoalmente, gosto do comando 'batch'.
Isso o coloca em segundo plano e envia os resultados para você. É uma parte do cron.
fonte
Como outros observaram, para executar um processo em segundo plano para que você possa se desconectar da sua sessão SSH, é necessário que o processo em segundo plano se desassocie adequadamente de seu terminal de controle - que é a pseudo-tty que a sessão SSH usa.
Você pode encontrar informações sobre processos de daemon em livros como o "Advanced Network Program, Stevens, Vol. 1, 3rd Edn" ou "Advanced Unix Programming" de Rochkind.
Recentemente (nos últimos dois anos) tive que lidar com um programa recalcitrante que não se daemonizou adequadamente. Acabei lidando com isso criando um programa de daemonização genérico - semelhante ao nohup, mas com mais controles disponíveis.
O traço duplo é opcional em sistemas que não usam a função GNU getopt (); é necessário (ou você deve especificar POSIXLY_CORRECT no ambiente) no Linux etc. Como o traço duplo funciona em qualquer lugar, é melhor usá-lo.
Você ainda pode entrar em contato comigo (ponto de nome sobrenome no gmail ponto com) se desejar a fonte
daemonize
.No entanto, o código está agora (finalmente) disponível no GitHub no meu repositório SOQ (Stack Overflow Questions) como arquivo
daemonize-1.10.tgz
no subdiretório packages .fonte
Em um sistema baseado no Debian (na máquina remota) Instale:
Uso:
Para renomear a sessão:
Para sair da sessão:
(isso sai da sessão do tmux). Em seguida, você pode sair do SSH.
Quando precisar voltar / verificar novamente, inicie o SSH e digite
O levará de volta à sua sessão do tmux.
fonte
Para a maioria dos processos, você pode pseudo-daemonizar usando este antigo truque de linha de comando do Linux:
Por exemplo:
Em seguida, inicie uma nova janela do terminal e:
Mostrará que
sleep 30
ainda está em execução.O que você fez foi iniciar o processo como filho de uma criança e, quando você sai, o
nohup
comando que normalmente acionaria o processo para sair não cai em cascata no neto, deixando-o como um processo órfão, ainda em execução .Eu prefiro este "defini-lo e esquecê-lo" abordagem, não há necessidade de lidar com
nohup
,screen
, tmux, I / o redirecionamento, ou qualquer dessas coisas.fonte
Se você usar a tela para executar um processo como root, tenha cuidado com a possibilidade de ataques de elevação de privilégio. Se sua conta for comprometida de alguma forma, haverá uma maneira direta de assumir o controle de todo o servidor.
Se esse processo precisar ser executado regularmente e você tiver acesso suficiente no servidor, uma opção melhor seria usar o cron para executar o trabalho. Você também pode usar o init.d (o super daemon) para iniciar seu processo em segundo plano, e ele pode terminar assim que terminar.
fonte
nohup
é muito bom se você deseja registrar seus detalhes em um arquivo. Mas quando se trata de segundo plano, você não pode fornecer uma senha se seus scripts solicitarem. Eu acho que você deve tentarscreen
. é um utilitário que você pode instalar na sua distribuição linux usando yum, por exemplo, no CentOSyum install screen
e acessar seu servidor via massa ou outro software, no seu tipo de shellscreen
. Ele abrirá a tela [0] em massa. Você trabalha. Você pode criar mais telas [1], telas [2] etc. na mesma sessão de massa.Comandos básicos que você precisa conhecer:
Para iniciar a tela
tela
Para c próxima tela reate
ctrl + a + c
Para mover para n tela ext você criou
ctrl + a + n
To d etach
ctrl + a + d
Durante o trabalho, feche sua massa. E na próxima vez que você fizer login via tipo de massa
tela -r
Para reconectar-se à sua tela, e você pode ver seu processo ainda em execução na tela. E para sair da tela, digite #exit.
Para mais detalhes veja
man screen
.fonte
yum
é a ferramenta certa, quando você não conhece a distribuição, não é bom. você deve deixar claro em quais distrosscreen
podem ser instaladasyum
.O Nohup permite que um processo do cliente não seja morto se um processo pai for morto, para discussão quando você efetuar logout. Ainda melhor ainda:
Nohup torna o processo que você inicia imune à finalização, que sua sessão SSH e seus processos filhos são eliminados após o logout. O comando que forneci fornece uma maneira de armazenar o pid do aplicativo em um arquivo pid, para que você possa matá-lo corretamente mais tarde e permitir que o processo seja executado após o logout.
fonte
Use a tela. É muito simples de usar e funciona como vnc para terminais. http://www.bangmoney.org/presentations/screen.html
fonte
Se você também deseja executar aplicativos X - use xpra junto com "screen".
fonte
eu também iria para o programa de tela (eu sei que a resposta some1 else foi tela, mas esta é uma conclusão)
não apenas o fato de que &, ctrl + z bg rejeita, nohup, etc. pode lhe dar uma surpresa desagradável de que, quando o trabalho de logoff ainda será morto (não sei por que, mas aconteceu comigo, e não incomodou com isso, porque eu mudei para usar a tela, mas acho que a solução anthonyrisinger, como a bifurcação dupla resolveria isso), também a tela tem uma grande vantagem sobre apenas o back-grounding:
e btw, esta é uma pergunta que eu nunca faria em primeiro lugar :) ... eu uso a tela desde o início para fazer qualquer coisa em qualquer unix ... eu (quase) NUNCA trabalho em um shell unix / linux sem a tela inicial primeiro ... e eu devo parar agora, ou vou começar uma apresentação interminável do que é uma boa tela e o que pode fazer por você ... procure por si mesmo, vale a pena;)
fonte
&
(execução assíncrona) foi introduzida pelo shell Thompson em 1971 , para a primeira versão do UNIX ... então literalmente "sempre foi" ;-) infelizmente, Eu era muito conservador - já faz 41 anos.Há também o daemon comando do pacote libslack de código aberto.
daemon
é bastante configurável e se preocupa com todas as coisas tediosas do daemon, como reinicialização automática, log ou manipulação de arquivos de pid.fonte
Anexe esta string ao seu comando:> & - 2> & - <& - &. > & - significa fechar stdout. 2> & - significa stderr próximo. <& - significa fechar stdin. & significa executar em segundo plano. Isso funciona para iniciar programaticamente um trabalho via ssh também:
fonte
Eu usei o comando screen. Este link contém detalhes de como fazer isso
https://www.rackaid.com/blog/linux-screen-tutorial-and-how-to/#starting
fonte
Resposta aceita sugerir o uso de nohup . Prefiro sugerir o uso do pm2 . O uso do pm2 sobre nohup tem muitas vantagens, como manter o aplicativo ativo, manter arquivos de log para aplicativos e muito mais outros recursos. Para mais detalhes verifique isso .
Para instalar o pm2, você precisa fazer o download do npm . Para sistema baseado em Debian
e para Redhat
Ou você pode seguir estas instruções . Após instalar o npm, use-o para instalar o pm2
Feito isso, você pode iniciar seu aplicativo
Para monitoramento de processo, use os seguintes comandos:
Gerencie processos usando o nome do aplicativo ou a identificação do processo ou gerencie todos os processos juntos:
Arquivos de log podem ser encontrados em
Arquivos executáveis binários também podem ser executados usando o pm2. Você precisa fazer uma alteração no arquivo jason. Altere o
"exec_interpreter" : "node"
, para"exec_interpreter" : "none".
(consulte a seção de atributos ).Compilando código acima
e execute-o com o np2 em segundo plano
fonte
No systemd / Linux, systemd-run é uma boa ferramenta para iniciar processos independentes de sessão. Aborrecedores que vão odiar
fonte