Por que executar um comando de shell do Linux com '&'?

30

Estou usando o Red Hat Linux Enterprise versão 5. Notei pessoas às vezes executando comandos com algumas &opções. Por exemplo, no comando abaixo, existem dois &sinais. Qual é o propósito deles? Eles sempre são usados ​​junto com nohup?

nohup foo.sh <script parameters> >& <log_file_name> &
George2
fonte

Respostas:

15

Além das respostas de Martin, Ash e Kevin, às vezes você verá um e comercial usado matematicamente para AND * a bit a bit :

$ echo $(( 11 & 7 ))
3

Caso você não esteja familiarizado com operadores de bits:

11: 1011
 7: 0111
-------- AND
 3: 0011

Em cada posição, há um bit no primeiro número E no segundo número, defina esse bit como um na resposta.

* O recurso na resposta de Kevin é referido como um AND lógico .

Para elaborar a resposta de Ash, quando usado no redirecionamento, o e comercial pode dizer ao shell para copiar um descritor de arquivo. Nesse comando, echo "hello" > outputfile 2>&1o e comercial faz com que qualquer saída que possa ir para o erro padrão (stderr, descritor de arquivo 2) vá para o mesmo local da saída padrão (stdout, descritor de arquivo 1, o padrão para o lado esquerdo >). O >& outputfileoperador é uma abreviação de > outputfile 2>&1.

Além disso, novo no Bash 4, há dois novos terminadores para cláusulas no casecomando ;&e ;;&que afetam se um caso "falha" e, se houver, se o próximo teste é executado.

Pausado até novo aviso.
fonte
Legal, Dennis! Suponha que eu use o log do terminal ssh em uma máquina e, em seguida, use o terminal do ssh para executar o comando (suponha um processo de longo prazo); se eu sair da sessão do terminal, o processo de longo prazo do comando será encerrado corretamente? E se eu quiser que o comando continue a executar mesmo que saia do shell, devo usar nohup ou & (no final do comando) ou usar nohup e &?
precisa
1
@ George2: Não, >& filenamegera stdout e stderr para o mesmo arquivo. Se você deseja redirecionar apenas o stderr (e deixar o stdout em paz), você o faria 2> filename. Quanto à sua outra pergunta, provavelmente você usaria ambos nohupe &.
Pausado até novo aviso.
1
@ George2: Se você não usar o comando em segundo plano, não receberá um prompt de shell para poder emitir um comando logoutou exit.
Pausado até novo aviso.
2
George: Se você não usar o &, nunca receberá seu aviso novamente para fazer outra coisa. O terminal será “travado” até que o processo (seja o que for) termine ou seja finalizado / finalizado. O & garante que o processo seja executado em segundo plano. No entanto, se você efetuar logoff, o sistema operacional encerrará todos os seus processos, o que também mata seu processo em segundo plano. Se você usa nohup, está dizendo ao processo "ignore o comando que o encerrará".
Martin Marconcini
1
@ George2: Sim. "imune a interrupções" == "processo continua" e "não-tty" == "encerra a sessão do console do terminal"
Pausada até novo aviso.
32

Em um script de shell Bash, o e comercial "&" é usado para bifurcar processos:

find -name hello &

Isso fará com que o comando find seja bifurcado e executado em segundo plano (você sempre pode matá-lo pelo seu PID).

Martin Marconcini
fonte
Obrigado Martin, suponha que eu use o log do terminal ssh em uma máquina e, em seguida, use o terminal do ssh para executar o comando (suponha um processo de longo prazo); se eu sair da sessão do terminal, o processo de longo prazo do comando será encerrado corretamente ? E se eu executar o comando usando o & no terminal ssh, mesmo que eu saia do terminal, o processo de longo prazo do comando ainda está em execução, correto?
precisa
1
Isso é George correto. Os processos em segundo plano devem continuar até que eles saiam ou você os mate. No entanto, como já foi apontado, você precisará de nohup para evitar que o processo morra quando o usuário fizer logoff.
Martin Marconcini 15/06
Obrigado Martin! Quero saber por que precisamos usar o & e nohup, e quais são suas funções individuais que nos levam a atingir o objetivo de permitir que o comando continue em execução, mesmo que o console do terminal saia. Eu li a página de manual do nohup e é mencionado "execute um comando imune a hangups, com saída para não-tty"; estou confuso se o imune a hangups é o que você quer dizer com deixar o comando continuar a ser executado sem o impacto de sair console de terminal? Nesse caso, acho que usar nohup é suficiente e não é necessário usar &. Algum comentário?
George2
1
Você precisa usar Both, se você não usar &, o terminal não permitirá que você insira nenhum outro comando. A melhor maneira de vê-lo é apenas tentar. Um bom exemplo é um comando que leva algum tempo, como um achado: find -name SomeName /> somefile.txt tente isso com nohup e & e veja as diferenças.
Martin Marconcini
Isto tem uma grande resposta para a pergunta nohup: serverfault.com/questions/311593/...
joshperry
26

Por que executar um comando de shell do Linux com '&'?

Para recuperar seu prompt imediatamente e executar o processo em segundo plano.

Qual é a função deles?

nohup permite que o processo em segundo plano continue em execução mesmo depois que o usuário efetua logout (ou sai do shell inicial).

> & redireciona a saída padrão e o erro padrão para o arquivo de log.

& executa a coisa toda em segundo plano, retornando sua solicitação imediatamente.

Explicação:

Todo processo do Linux abre três canais de E / S, uma entrada "stdin", uma saída padrão "stdout" e uma saída de erro padrão "stderr". Eles podem ser usados ​​para binários, mas são tradicionalmente textos. Quando a maioria dos programas vê o stdin fechar, eles saem (isso pode ser alterado pelo programador).

Quando o shell pai sai, stdin é fechado nos filhos e (geralmente, geralmente) os filhos também saem. Além disso, os filhos recebem um sinal de software, SIGHUP, indicando que o usuário "desligou" (anteriormente, o modem) e o padrão aqui é sair também. (Observe, um programador pode alterar tudo isso ao escrever o programa).

Portanto, o que o nohup faz é fornecer ao processo filho um ambiente de E / S separado, vinculando entradas e saídas a algo que não esteja vinculado ao shell pai e protegendo o filho do sinal SIGHUP. Depois que o usuário se desconectar, você verá o processo em segundo plano nohup pertencente ao init (processo 1), não ao shell do usuário.

No entanto, nohupnão é possível executar o trabalho completamente se o processo for executado em primeiro plano, por isso &é usado para executar o programa em segundo plano, onde ele pode continuar sendo executado com ou sem um usuário conectado.

kmarsh
fonte
Suponha que eu use o log do terminal ssh em uma máquina e, em seguida, use o terminal do ssh para executar o comando (suponha um processo de longo prazo); se eu sair da sessão do terminal, o processo de longo prazo do comando será encerrado corretamente? E se eu quiser que o comando continue a executar mesmo que saia do shell, devo usar nohup ou & (no final do comando) ou usar nohup e &?
precisa
1
Correto, use nohup e & para que o processo continue após o SSH desconectar.
kmarsh
Obrigado Kmarsh! Quero saber por que precisamos usar o & e nohup, e quais são suas funções individuais que nos levam a atingir o objetivo de permitir que o comando continue em execução, mesmo que o console do terminal saia. Eu li a página de manual do nohup e é mencionado "execute um comando imune a hangups, com saída para não-tty"; estou confuso se o imune a hangups é o que você quer dizer com deixar o comando continuar a ser executado sem o impacto de sair console de terminal? Nesse caso, acho que usar nohup é suficiente e não é necessário usar &. Algum comentário?
precisa
1
Vou editar minha resposta para responder.
kmarsh
13

Além da resposta de @ Martin: O outro uso do e comercial ( >&como acima) é capturar ambos stdoute stderr. Normalmente, se você redirecionasse a saída para um arquivo com apenas '>', você apenas obteria a saída stdout, perdendo quaisquer erros.

Cinza
fonte
1. Obrigado Ash, quero confirmar com você que "> & <nome do arquivo de log>", despejará todos os stderr e stdout no arquivo de log, correto? 2. E o uso de "> <nome do arquivo de log>" despeja todos os stdout no arquivo de log, correto?
precisa
1
@ George: Sim, está certo.
Ash
Obrigado Ash! Quero saber por que precisamos usar o & e nohup, e quais são suas funções individuais que nos levam a atingir o objetivo de permitir que o comando continue em execução, mesmo que o console do terminal saia. Eu li a página de manual do nohup e é mencionado "execute um comando imune a hangups, com saída para não-tty"; estou confuso se o imune a hangups é o que você quer dizer com deixar o comando continuar a ser executado sem o impacto de sair console de terminal? Nesse caso, acho que usar nohup é suficiente e não é necessário usar &. Algum comentário?
George2
4

Além da resposta de Martin e Ash, às vezes você pode ver o uso de um &&token. Isso é usado para dizer "execute o segundo comando se e somente se o primeiro comando for executado com êxito". Um comando bem escrito, se houver algum erro, não será encerrado com êxito.

[kevin@box ~]$ ls file && echo removing file && rm file
ls: file: No such file or directory
[kevin@box ~]$ touch file
[kevin@box ~]$ ls file && echo removing file && rm file
file
removing file
[kevin@box ~]$
Kevin M
fonte
Legal Kevin! Suponha que eu use o log do terminal ssh em uma máquina e, em seguida, use o terminal do ssh para executar o comando (suponha um processo de longo prazo); se eu sair da sessão do terminal, o processo de longo prazo do comando será encerrado corretamente? E se eu quiser que o comando continue executando mesmo que eu saia do shell, devo usar nohup ou & (no final do comando) ou usar nohup e &?
precisa
Qualquer um funcionaria. NOHUP era a maneira original de fazê-lo, imagino (mas estou totalmente adivinhando), mas o pano de fundo funciona agora. Uma diferença importante é ao executar um shell interativo, colocando o sshing em um sistema remoto. O processo NOHUP seria executado em primeiro plano, mas continuaria em execução se você sair, enquanto o processo em segundo plano retornaria imediatamente após a geração do comando. Mas quando você tenta sair de um shell interativo com um comando em execução em segundo plano, você é avisado primeiro.
Kevin M
2

A resposta de Martin é boa, mas um pouco ambígua. O comando sempre é bifurcado e executado, mas o comportamento normal do shell é aguardar o comando até que ele saia. Oe comercial coloca-o em segundo plano, para que você receba de volta o prompt do terminal e faça outras coisas. Se o processo distribuir dados para stdout ou stderr, isso será misturado com o que você estiver fazendo no prompt e poderá confundi-lo. É por isso que você o redireciona com> & /path/to/logfile.txt.

Em resposta ao George2, o comportamento normal de um shell sair é enviar o sinal SIGHUP para todos os processos no mesmo grupo de processos (essencialmente coisas que você gerou) e eles geralmente serão encerrados. Se você desejar que isso continue mesmo se você fechar o processo do shell, poderá usar o comando nohup para fazer com que eles ignorem esse sinal e continuem em execução. Há um nome especial para esse tipo de processo, chamado de processo daemon (pronunciado 'demônio').

Rich Homolka
fonte
Obrigado Rich! Suponha que eu use o log do terminal ssh em uma máquina e, em seguida, use o terminal do ssh para executar o comando (suponha um processo de longo prazo); se eu sair da sessão do terminal, o processo de longo prazo do comando será encerrado corretamente? E se eu quiser que o comando continue executando mesmo que eu saia do shell, devo usar nohup ou & (no final do comando) ou usar nohup e &? E porque?
precisa
Hey George, desculpe, estou respondendo tão tarde. Sim, se você sair do shell, o processo de longo prazo será encerrado. Se você quiser continuar, precisará fazer o nohup (para não terminar quando o shell for fechado) e & (para colocar em segundo plano, para que você possa usar o Crtl-D ou sair do shell). Você também pode observar o comando setsid, que permitirá a execução do processo, ignorando o SIGHUP de uma maneira um pouco diferente.
Rich Homolka
Ótima resposta, explica as práticas recomendadas para processos iniciados em shell em execução em segundo plano.
Marcel Valdez Orozco