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 ...
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).
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)
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.
@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.
nohup
,&
edisown
, clique aqui para ir até a quarta resposta .Respostas:
Você pode simplesmente executar o script em segundo plano:
Observe que isso é diferente de colocar o
&
dentro do script, o que provavelmente não fará o que você deseja.fonte
&
estiver dentro do script e você não tiver umwait
, o comando de fundo será eliminado quando o script for encerrado.myscript
modifica 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?Todo mundo simplesmente esqueceu
disown
. Então, aqui está um resumo:&
coloca o trabalho em segundo plano.disown
remove o processo do controle de trabalho do shell, mas ainda o deixa conectado ao terminal.SIGHUP
(se o shell receber umSIGHUP
, ele também enviará umSIGHUP
para o processo, o que normalmente faz com que o processo seja encerrado).nohup
desconecta o processo do terminal, redireciona sua saídanohup.out
e o protegeSIGHUP
.SIGHUP
.&
(como um trabalho em segundo plano).fonte
disown
no Debian ou OS X. Pensei que fosse um programa, mas pareço estar enganado. O que é isso?não desliga ao fechar o terminal. a saída por padrão vai para nohup.out
Você pode combinar isso com fundo,
e se livrar da saída,
você também pode
disown
um comando. tipocmd
,Ctrl-Z
,bg
,disown
fonte
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á.jobs
.Como alternativa, depois de colocar o programa em execução, você pode pressionar Ctrl-Z para interromper o programa e digitar
que coloca seu último programa interrompido em segundo plano. (Útil se você iniciou algo sem '&' e ainda quer em segundo plano, sem reiniciá-lo)
fonte
screen -m -d $command$
inicia o comando em uma sessão separada. Você pode usarscreen -r
para anexar à sessão iniciada. É uma ferramenta maravilhosa, extremamente útil também para sessões remotas. Leia mais emman screen
.fonte