Execute o script Bash em segundo plano e saia do terminal

19

É possível iniciar um comando ou terminal de saída de script Bash e NÃO interromper o comando?

Minha solução foi executar o cron em uma hora específica do dia, mas tenho certeza de que há algo mais fácil.

Peter Mortensen
fonte

Respostas:

45

Para evitar que os sinais de saída se propaguem aos processos filhos do terminal e shell, execute o comando com nohup, ou seja:

nohup cmd &
Thor
fonte
1
Essa é a resposta correta. Sem nohup, o processo iniciado ainda é considerado um "filho" do processo do terminal e, portanto, finalizado se o terminal estiver fechado.
Izzy
3
cmd & disowntambém funciona, já que o &é tratado como um ;separador de comandos. O comando disown remove a conexão entre a sessão do shell bash e o comando em segundo plano.
Lornix 14/07/2012
2
zsh tem um atalho para isso: cmd &|.
Thor
Para que isso funcionasse, tive que alterar uma preferência no Terminal.app. Em Perfis, selecione o perfil ativo, então Shell> Quando as saídas shell> Fechar se o shell saiu limpa
Antoine
6

Usando screen:

screen -S <session name> -d -m <your command>

Depois disso, você pode sair do terminal, também pode anexá-lo novamente:

screen -r <session name>

Mais informações: referência

Bruce
fonte
4

Se você deseja executar um comando ou arquivo específico a cada segundo ou mais em segundo plano depois de sair do terminal, pode tentar esta pequena coisa fácil;

nohup watch -n5 'bash script.sh' &

Isso executaria o scipt.sh a cada 5 segundos.

jamietelin
fonte
1
"nohup" já está coberto pela resposta aceita. E tenho certeza de que o autor da pergunta mencionou o cron porque o estava usando para dizer "Execute este comando alguns segundos no futuro", para não executá-lo periodicamente.
David Richerby
1
Minha resposta não piora as coisas. Veja o ponto do voto negativo. Neural seria suficiente.
jamietelin
3

Coloque um caractere "&" após o seu comando.

por exemplo:

/home/your/script.sh &
Flinth
fonte
7
neste caso, quando o terminal está fechado, o processo é iniciado por /home/your/script.sh- como não foi destacado de seu "pai", mas apenas "em segundo plano". Use nohuppara desconectá-lo de verdade.
Izzy
My bad, eu não sabia sobre isso, mas quando eu testei no meu Debian, o comando mantido execução depois de fechar o shell que lançou-lo: /
Flinth
1
Não tenho certeza de onde exatamente o processo em segundo plano está anexado e quando. Mas se você, por exemplo, fizer login em uma máquina remota, ele definitivamente será interrompido assim que você sair (exceto se for daemonizado ). Para ter 100% de certeza, você prefere usar nohup- o que também registra toda a saída (agora invisível) em um arquivo chamado nohup.outlocalizado no diretório em que você iniciou o comando.
Izzy
Ok, bem, obrigado pelas suas explicações ^^
Flinth
Esta resposta pode funcionar bem quando combinada com o jobscomando. Muitas vezes, eu quero poder voltar ao processo de shell após o plano de fundo.
precisa saber é o seguinte