Como executar um comando em segundo plano e não obter saída?

111

Escrevi dois scripts de shell a.she b.sh. In a.she b.sheu tenho um loop for infinito e eles imprimem alguma saída para o terminal. Quero escrever outro script que chame ambos a.she, b.shmas quero que o usuário recupere o controle do terminal imediatamente, em vez de fazer o script rodar infinitamente e quero ocultar a saída no terminal.

Behnam Safari
fonte

Respostas:

220

Use nohupse seu trabalho em segundo plano demorar para terminar ou se você apenas usar SecureCRT ou algo parecido para fazer o login no servidor.

Redirecionar o stdout e stderr para /dev/nullignorar a saída.

nohup /path/to/your/script.sh > /dev/null 2>&1 &
George
fonte
Apenas para adicionar, às vezes há argumentos para os scripts, então o comando acima retornará um redirecionamento de saída ambíguo .
sabertooth1990
Uma maneira melhor que encontrei é usar nohup /path/to/your/script.sh parameter1 > & 1 &Se alguém souber de uma maneira melhor.
sabertooth1990
18
Você não precisa /dev/null 2>&1se estiver usando, nohuppois ele já anexa todos os streams STDOUT e STDERR ao arquivo nohup.out automaticamente. Use apenas:nohup /path/to/your/command &
Leonardo
1
@ sabertooth1990 Sua linha de comando está com defeito:-bash: syntax error near unexpected token '&'
notes-jj
1
Como você mataria o processo criado?
Alexis_A
33

Redirecione a saída para um arquivo como este:

./a.sh > somefile 2>&1 &

Isso irá redirecionar stdout e stderr para o mesmo arquivo. Se você deseja redirecionar stdout e stderr para dois arquivos diferentes, use isto:

./a.sh > stdoutfile 2> stderrfile &

Você pode usar /dev/nullcomo um ou ambos os arquivos se não se importar com o stdout e / ou stderr.

Veja a página de manual do bash para detalhes sobre redirecionamentos.

Adam Zalcman
fonte
23

Desculpe, isso é um pouco tarde, mas encontrei a solução ideal para alguns comandos onde você não quer nenhuma saída padrão ou de erro (crédito onde é devido: http://felixmilea.com/2014/12/running-bash-commands-background -propriadamente / )

Isso redireciona a saída para nulo e mantém a tela limpa:

command &>/dev/null &
Dante Alighieri
fonte
2
Nota: o comando será encerrado quando o terminal for fechado.
Banana de
1
Para quem está olhando para isso no futuro e quer uma solução para manter os comandos em execução após o término de uma sessão, sugiro screen ou tmux. Eles essencialmente executam uma 'sessão dentro de uma sessão' que continua após o encerramento da sessão inicial. Você pode então se reconectar à sessão em andamento se fizer login novamente. Ótimo para executar backups rsync, por exemplo, quando a sincronização precisa ser executada por um longo tempo e você não quer deixar sua sessão em execução.
DanteAlighieri
13

Se eles estiverem no mesmo diretório que seu script que contém:

./a.sh > /dev/null 2>&1 &
./b.sh > /dev/null 2>&1 &

O &no final é o que faz seu script rodar em segundo plano.

A > /dev/null 2>&1parte não é necessária - ela redireciona os streams stdout e stderr para que você não precise vê-los no terminal, o que você pode querer fazer para scripts barulhentos com muita saída.

Michael Chinen
fonte
7

Execute em um subshell para remover notificações e fechar STDOUT e STDERR:

(&>/dev/null script.sh &)
Tom Hale
fonte
Esta é a única resposta que também não imprime logs de trabalhos em segundo plano como [1] + 54765 done <emacs>agradecimento
depois de
2

Se você deseja executar o script em um kickstart do Linux, você deve executar conforme abaixo.

sh /tmp/script.sh > /dev/null 2>&1 < /dev/null &
SARATH CHANDRAN
fonte
1
nohup sh -x runShellScripts.sh &
vaquar khan
fonte
o que -xfaz?
sempre
0

Estes exemplos funcionam bem:

nohup sh prog.sh proglog.log 2> & 1 &

Para loop, você pode usar assim:

para i em {1..10}; do sh prog.sh; dormir 1; done prog.log 2> & 1 &

Ele funciona em segundo plano e não mostra nenhuma saída.

Ramin Ismayilli
fonte