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

95
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 & , o script não voltará ao prompt até pressionar Ctrl + C . Com & eu posso pressionar enter e funciona.

    
por user4951 10.08.2013 / 13:38

4 respostas

73

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

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

Com & , o processo inicia em segundo plano, portanto, você pode continuar usando o shell e não precisa esperar até que o script seja concluído. Se você esquecer, poderá interromper o processo atual em execução com Ctrl-Z e continuar em segundo plano com bg (ou em primeiro plano com fg ). Para mais informações, consulte o controle do trabalho

    
por 10.08.2013 / 13:44
73

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

Você pode ver a lista de trabalhos atualmente em execução com o comando jobs . Você pode retornar ao comando (trazer para o 'primeiro plano') com o uso do comando fg . O que puxa o comando de volta para o estado onde você não vê nenhum prompt e você tem que emitir Ctrl - C para matar o processo. Você pode, no entanto, suspender (pausa) o processo, emitindo Ctrl - Z . Isso irá pausar sys-snap.sh e retornar você ao seu prompt. Você pode então fazer um plano de fundo (como se tivesse emitido com & ) com o comando bg , e ele retomar executando a partir do estado pausado < kbd> Ctrl - Z colocara.

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

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

Você pode colocar em segundo plano e em primeiro plano usando o número do trabalho, %1 será sys-snap.sh e %2 será another-script.sh . Se você usar fg ou bg sem argumentos, ele acionará o comando na tarefa marcada por + na saída jobs acima.

fg %1

colocará sys-snap.sh de volta no primeiro plano, deixando another-script.sh em segundo plano.

Você pode emitir a seqüência Ctrl - C para executar tarefas sem ter que forçá-las com o comando kill , kill %1 enviará o equivalente a Ctrl - C para sys-snap.sh .

Se você estiver usando o bash shell, o comando man bash tem uma seção detalhada sob a seção intitulada 'JOB CONTROL' entrando em mais detalhes.

Quanto ao nome de sys-snap.sh , sob nomes de arquivos unix são arbitrários (com algumas exceções, como arquivos do carregador dinâmico). Não há nenhum requisito para que eles tenham extensões de arquivo específicas para executá-los como um script de shell, invocar outros comandos como perl ou php etc. Ele é normalmente usado para fornecer clareza, que neste caso, é .sh um script de shell usando o Bourne Shell /bin/sh .

A parte funcional de sys-snap.sh (quando você olha seu conteúdo com algo como o comando less ) é 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, o 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 com chmod para que você possa executá-lo como um comando. Se as permissões não foram definidas, o shebang não terá efeito, porque você obterá o erro:

bash: sys-snap.sh: command not found

ou se você o executou pelo caminho explícito ./sys-snap.sh ( . que significa 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 solicitar explicitamente ao / bin / sh para executá-lo:

/bin/sh sys-snap.sh &
    
por 10.08.2013 / 14:12
4

sh é um shell. Qual shell depende exatamente do sistema. Exemplo para um sistema que usa bash como 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.sh será um script de shell de algum tipo, então sh sys-snap.sh executará o script de shell.

& 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 forma, é apenas uma questão de esperar que o script termine ou não antes de executar comandos adicionais.

    
por 10.08.2013 / 13:43
1

O seu servidor está no hostgator?

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

    
por 24.10.2013 / 14:22

Tags