O que significa e comercial no final de uma linha de script de shell?

118
sh sys-snap.sh &

O que é sh? O que é sys-snap.sh? Por que eu deveria colocar &no final da linha? Alguém pode explicar a sintaxe?

Sem o &script, você não retornará ao prompt até pressionar Ctrl+ C. Com &eu posso pressionar enter e funciona.

user4951
fonte
2
o duplo e comercial é &&diferente de um único e comercial &?
Charlie Parker
1
@CharlieParker Você já encontrou uma resposta para isso? Estou tentando descobrir a diferença sozinho. (Edit: Nevermind, achei mais abaixo)
Drazen Bjelovuk

Respostas:

94

shé o shell padrão compatível com Bourne (geralmente bash ou dash)

sys-snap.shé um script de shell, que contém comandos que são shexecutados. Como você não publica o conteúdo, só posso adivinhar pelo nome, o que ele faz. Posso encontrar um script relacionado ao CPanel com o mesmo nome de arquivo, que cria um arquivo de log com todos os processos atuais, uso atual da memória, status do banco de dados etc. Se o script iniciar com uma linha shebang ( #!/bin/shou similar), você poderá executá-lo com chmod +x sys-snap.she inicie-o diretamente usando ./sys-snap.shse estiver no diretório atual.

Com &o processo iniciado em segundo plano, você pode continuar usando o shell e não precisar esperar até que o script seja concluído. Se você o esquecer, poderá interromper o processo atual em execução Ctrl-Ze continuar em segundo plano com bg(ou em primeiro plano com fg). Para obter mais informações, consulte Controle de tarefas.

jofel
fonte
4
shgeralmente apenas bashou dashem sistemas baseados em Linux (ou OS / X recente). Nos BSDs, geralmente é outra variante do Ash (o traço é baseado no NetBSD sh, ele próprio no Almquist Shell) ou um derivado do pdksh. Nos escritórios comerciais, geralmente é ksh88.
Stéphane Chazelas
1
@ jofel: E se o script abaixo estiver sendo executado e por engano eu executei Ctrl-C. Meu script será executado ou será encerrado? Ex: sys-snap.sh sh &
Hussain7
2
@ Hussain7 O Ctrl-C é enviado sempre para o processo atual em primeiro plano. Se o shell-script for iniciado &e, portanto, em segundo plano, você receberá apenas um novo prompt de shell.
Jofel
2
o duplo e comercial é &&diferente de um único e comercial &?
Charlie Parker
7
@CharlieParker Sim, "&&" é a função "and". O comando após && é chamado apenas quando o comando anterior é bem-sucedido. O exemplo "true && echo works" output "funciona, mas" false && echo no output "não chama a função echo.
jofel
87

Isso é conhecido como job controlsob unix. O &informa ao shell para colocar o comando em segundo plano. Isso significa que ele continua executando o sys-snap.shcomando, mas retorna ao seu shell para permitir que você continue executando comandos paralelos.

Você pode ver a lista de tarefas atualmente em execução com o jobscomando Você pode retornar ao comando (trazer para o primeiro plano) com o uso do fgcomando. O que puxa o comando de volta ao estado em que você não vê nenhum prompt e precisa emitir Ctrl- Cpara interromper o processo. No entanto, você pode suspender (pausar) esse processo, emitindo Ctrl- Z. Isso fará uma pausa sys-snap.she retornará você ao seu prompt. Você pode, então, fundo dele (como se você tinha emitido com a &) com o bgcomando, e ele vai retomar a correr a partir dele está em pausa estado Ctrl- Ztinha colocá-lo.

Observe que você pode ter mais de um trabalho por vez (como mostrado jobs):

[1]-  Running          sys-snap.sh &
[2]+  Running          another-script.sh &

Você pode colocá-los em segundo plano e em primeiro plano usando o número do trabalho, %1será sys-snap.she %2será another-script.sh. Se você usar fgou bgsem argumentos, ele executará o comando no trabalho marcado por +na jobssaída acima.

fg %1

voltará sys-snap.shao primeiro plano, deixando-o another-script.shem segundo plano.

Você pode emitir o Ctrl- Cseqüência para executar trabalhos sem ter que primeiro plano-los com o killcomando, kill %1irá enviar o equivalente a Ctrl- Ca sys-snap.sh.

Se você estiver usando o bash shell, o man bashcomando possui uma seção detalhada na seção 'CONTROLE DE TRABALHO', que entra em mais detalhes.

Quanto ao nome de sys-snap.sh, os nomes de arquivos sob unix são arbitrários (com algumas exceções, como arquivos do carregador dinâmico). Não é necessário que eles tenham extensões de arquivo específicas para executá-los como um script de shell, invocar outros comandos como perlou phpetc. Geralmente, é usado para fornecer clareza, que nesse caso, é .shum Shell Script usando o Bourne Shell /bin/sh.

A parte funcional de sys-snap.sh(quando você olha para o conteúdo com algo como o lesscomando) é o Shebang . Na primeira linha, você provavelmente encontrará um dos seguintes:

#! /bin/sh
#! /bin/bash
#! /usr/local/bin/bash

ou similar. Em termos básicos, um comando após o #!(como /bin/sh) é executado e o conteúdo do restante do arquivo de script é alimentado com uma linha por vez. Observe que o arquivo também deve ser definido como executável chmodpara que você possa executá-lo como um comando. Se as permissões não foram definidas, isso shebangnão terá efeito, porque você receberá o erro:

bash: sys-snap.sh: command not found

ou se você o executasse por caminho explícito ./sys-snap.sh( .o diretório de trabalho atual), você obteria:

bash: ./sys-snap.sh: Permission denied

A outra alternativa é deixá-lo sem permissões de execução e pedir explicitamente ao / bin / sh para executá-lo:

/bin/sh sys-snap.sh &
Drav Sloan
fonte
3
Esta é uma ótima resposta. Uma sugestão possível é adicionar também o que nohupfaz, pois é frequentemente usado em conjunto com &para iniciar um processo e ser capaz de matar o shell que o lançou sem interromper o processo.
Tommy
@ Drav, é verdade que jobssempre retornará vazio se for o primeiro comando?
Pacerier
Observe que o uso &no final de um comando apenas desanexa stdin(mas não stdoutou stderr), o que implica se o seu comando / script está sendo executado em segundo plano, mas está sendo gravado em stdout, você pode se deparar com uma situação em Ctrl + cque não interromperá a saída, mas poderá para digitar comandos. Isso ocorre porque o processo em segundo plano está sendo gravado, stdoutmas você não pode interrompê-lo porque não está sendo executado em primeiro plano. Mais informações aqui .
vadasambar 17/09
4

shé uma concha. Qual shell depende exatamente do sistema. Exemplo para um sistema que usa bashcomo seu shell padrão:

$ ls -l /bin/sh
lrwxrwxrwx 1 root root 4 Mar 13 16:12 /bin/sh -> bash

$ sh --version
GNU bash, version 4.2.45(1)-release (x86_64-pc-linux-gnu)

sys-snap.shserá algum tipo de script de shell, portanto, ele sh sys-snap.shserá executado.

&fará com que o processo do shell seja executado em segundo plano. Sem &ele, permanecerá em primeiro plano até o script terminar. O script funcionará de qualquer maneira, é apenas uma questão de esperar que o script termine ou não antes de executar outros comandos.

frostschutz
fonte
1

Seu servidor está no hostgator?

O script sys-snap.shé um script especial escrito pela equipe do hostgator para coletar todos os arquivos e dados de log do sistema, para que eles usem sua saída no monitoramento e na coleta de informações do sistema.

tareq.t
fonte
Não, eu não estou usando hostgator.
user4951
1
@ J.Chang O script faz parte do cPanel que o Hostgator e centenas de outros hosts usam.
472084
@ 472084, Qual versão do cpanel?
Pacerier