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> &

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.


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).


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.


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.


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 ~]$

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').


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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.