Comandos de shell assíncronos

100

Estou tentando usar um script de shell para iniciar um comando. Eu não me importo se / quando / como / por que isso termina. Quero que o processo seja iniciado e executado, mas quero poder voltar ao meu shell imediatamente ...

LorenVS
fonte
2
Relacionado, consulte Diferença entre nohup, disown e & no Unix e Linux Stack Exchange.
jww
1
Para aqueles que procuram uma resposta mais em profundidade, que fala sobre as diferenças entre nohup, &edisown , clique aqui para ir até a quarta resposta .
noɥʇʎԀʎzɐɹƆ

Respostas:

116

Você pode simplesmente executar o script em segundo plano:

$ myscript &

Observe que isso é diferente de colocar o &dentro do script, o que provavelmente não fará o que você deseja.

Carl Norum
fonte
1
Eu sabia que seria algo fácil, muito obrigado ... Linux não é minha praia, mas estou tentando me atualizar ... A propósito, isso vai funcionar quando combinado com nohup?
LorenVS
2
Qual é a diferença entre colocar o & na linha de comando e colocá-lo no script? Eu não sabia que eles eram diferentes.
Jacob Sharf
8
@JacobSharf, experimente e você verá. Se &estiver dentro do script e você não tiver um wait, o comando de fundo será eliminado quando o script for encerrado.
Carl Norum
oh. Isso explica muita coisa. Recentemente, notei algum efeito que seria causado por isso. Googling realmente me levou a esta página. Obrigado
Jacob Sharf
Se myscriptmodifica o ambiente do terminal, ex. é um comando de inicialização de terminal que não é necessário imediatamente e pode ser atrasado; ele ainda modificará o ambiente do terminal?
noɥʇʎԀʎzɐɹƆ
58

Todo mundo simplesmente esqueceu disown. Então, aqui está um resumo:

  • & coloca o trabalho em segundo plano.

    • Bloqueia na tentativa de ler a entrada, e
    • Faz com que o shell não espere sua conclusão.
  • disown remove o processo do controle de trabalho do shell, mas ainda o deixa conectado ao terminal.

    • Um dos resultados é que o shell não enviará um SIGHUP(se o shell receber um SIGHUP, ele também enviará umSIGHUP para o processo, o que normalmente faz com que o processo seja encerrado).
    • E, obviamente, ele só pode ser aplicado a trabalhos em segundo plano (porque você não pode inseri-lo quando um trabalho em primeiro plano está em execução).
  • nohupdesconecta o processo do terminal, redireciona sua saída nohup.oute o protege SIGHUP.

    • O processo não receberá nenhum enviado SIGHUP.
    • É totalmente independente do controle de tarefas e pode, em princípio, ser usado também para tarefas de primeiro plano (embora isso não seja muito útil).
    • Normalmente usado com &(como um trabalho em segundo plano).
Ani Menon
fonte
Não consigo encontrar disownno Debian ou OS X. Pensei que fosse um programa, mas pareço estar enganado. O que é isso?
jww
negar o comando e no OSX
Ani Menon
6
Esta é a melhor resposta. Mais abrangente.
noɥʇʎԀʎzɐɹƆ
3
Definitivamente a melhor resposta, não sei por que tão pequenos no-break
HeberLZ
1
@VladGanshin No.
Ani Menon
39
nohup cmd

não desliga ao fechar o terminal. a saída por padrão vai para nohup.out

Você pode combinar isso com fundo,

nohup cmd &

e se livrar da saída,

nohup cmd > /dev/null 2>&1 &

você também pode disownum comando. tipo cmd, Ctrl-Z, bg,disown

Steve B.
fonte
2
Legal, louco como tudo se combina, acho que a ordem me pegaria no começo, mas acho que você poderia simplesmente memorizá-la (o que você escreveu ou "nohup cmd &> / dev / null 2> & 1" :))
LorenVS
Eu tropecei nisso esta noite. Estou lutando com um script shell por 2 dias e essa sugestão fez as coisas funcionarem. Obrigada mucho!
JD Longo
Incrível, isso é muito útil. Ao executar no modo de segundo plano, você pode verificar a saída do comando de vez em quando usando tail nohup.out, isso exibirá as últimas 10 linhas da saída do comando. Eu uso isso para trabalhos de backup rsync para ver em qual arquivo ele está.
Martin Hansen
E se eu fizer isso, mas quiser interromper o processo em segundo plano?
Stephan Bijzitter
O shell imprime um identificador de trabalho quando você inicia um trabalho precisamente para esse propósito. Você pode ver seus trabalhos em execução a qualquer momento com jobs.
tripleee
26

Como alternativa, depois de colocar o programa em execução, você pode pressionar Ctrl-Z para interromper o programa e digitar

bg

que coloca seu último programa interrompido em segundo plano. (Útil se você iniciou algo sem '&' e ainda quer em segundo plano, sem reiniciá-lo)

Pajton
fonte
2
Obrigado, esse é um pequeno truque legal ... Começando a realmente apreciar algumas das qualidades da casca ...
LorenVS
3

screen -m -d $command$inicia o comando em uma sessão separada. Você pode usar screen -rpara anexar à sessão iniciada. É uma ferramenta maravilhosa, extremamente útil também para sessões remotas. Leia mais em man screen.

mluthra
fonte
@LadenkovVladislav Tenho 95% de certeza de que você pode instalar a tela no RedHat. Eu tenho no CentOS.
BuvinJ
No Ubuntu, eu queria emular o comando "iniciar" do Windows / batch. Ou seja, inicie de forma assíncrona um programa em primeiro plano (gui) e continue por meio de um script de shell. Isso faz exatamente isso.
BuvinJ