Como posso executar um programa do bash ignorando seu stdout para que eu possa executar mais programas? [fechadas]

1

Estou tentando criar um novo processo, de dentro de bash , como se nada tivesse acontecido, exceto que meu terminal está na próxima linha, onde esse processo normalmente roubaria meu stdout ...

Digamos que eu queira apt-get update agora, mas quero editar alguns arquivos de configuração em vez de assistir a downloads de tudo, por isso quero executar vi /some/config . Eu deveria ser capaz de fazer as duas coisas ao mesmo tempo, né?

Só para esclarecer, porque eu fiz um pouco de leitura antes de perguntar, eu quero que este processo sobreviva ao fechamento do terminal [se ainda não chegou ao seu fim] então eu acho que não é um processo infantil, provavelmente não é uma sub-casca, talvez um garfo? É o que eu quero dizer? Como eu bifar assim?

    
por 0x5f3759df 03.07.2017 / 14:43

6 respostas

0

Acredito que você esteja procurando o comando setsid , que inicia um programa em uma nova sessão. Então você pode:

setsid apt-get update

E, se você quiser que o apt-get update fique em silêncio:

setsid apt-get update >/dev/null 2>&1

A coisa boa com setsid é que o processo iniciado dessa maneira continuará depois que o terminal for fechado.

    
por 03.07.2017 / 16:36
1

Parece que você está procurando como executar um processo em segundo plano, permitindo que você continue com outro trabalho ao mesmo tempo. Isso é feito adicionando um E comercial ao final de um comando. Por exemplo, milissegundos depois de executar sleep 5h , você pode inserir outro comando enquanto o comando em segundo plano está fazendo sua parte. Para que o processo sobreviva ao fechamento do terminal, você precisará torná-lo órfão usando disown e, para não ver a saída padrão (ou erro padrão), é possível usar redireciona . Consulte gerenciamento de processos e o controle de trabalho para grande documentação.

Como alternativa, você pode executar um comando em primeiro plano e simplesmente iniciar outro terminal para fazer outra coisa. O sistema operacional cuida do resto.

    
por 03.07.2017 / 14:47
1

"< / dev / null" está lendo stdin de / dev / null - entrada redirecionada normal. Isso imediatamente retorna EOF, ou seja, está lendo de um arquivo vazio. É um idioma útil para casos em que você deseja ler de STDIN às vezes, mas não nesta ocasião.

    
por 03.07.2017 / 16:32
0
apt-get update > /dev/null 2>&1 &

apt-get update é o comando que você deseja executar.

> /dev/null canaliza todos stdout para / dev / null que, por padrão, se livra dele. Você poderia especificar um arquivo de log se quisesse ver a saída mais tarde.

2>&1 canaliza o stderr para stdout. Você pode substituir o & 1 por um arquivo de registro se quiser ver algum erro.

& faz o comando ser executado em segundo plano. Para ver qualquer coisa sendo executada em segundo plano, você pode tentar jobs . Se você quiser amarrar o processo ao seu shell, você pode executar fg

Se você quiser sobreviver depois de fechar o terminal, você pode disown processos em segundo plano.

    
por 03.07.2017 / 16:30
0
nohup apt-get update > /dev/null 2> /dev/null < /dev/null & vi /some/config

link

tecnicamente nohup implica stdin é / dev / null, então < /dev/null não é necessário

    
por 03.07.2017 / 15:54
0

Além de outras respostas (por exemplo, trabalho em segundo plano, nohup (1) , etc ...) você pode considerar o uso de batch (do pacote at que você precisa instalar ) com um documento aqui , por exemplo

batch << ENDOFJOB
 apt-get update
 apt-get upgrade
ENDOFJOB

(para executar comandos de administração como apt-get você pode precisar executar o batch como root)

Veja também os arquivos crontab (5) com comando crontab (1) , e em anacron (8) .

É claro que você pode querer redirecionar ambos stdout e stderr dos seus comandos apt-get (aos quais você pode querer passar --yes ; leia apt- get (8) ), talvez usando algo como apt-get update >& /tmp/your-apt-get-update.output .

Em relação a /dev/null , leia null (4) .

    
por 03.07.2017 / 16:37