Como posso colocar o processo Linux em execução em segundo plano? [fechadas]

111

Eu tenho um comando que carrega arquivos usando git para um servidor remoto do shell do Linux e levará muitas horas para terminar.

Como posso colocar esse programa em execução em segundo plano? Para que eu ainda possa trabalhar no shell e esse processo também seja concluído?

Miragem
fonte
Só um palpite, mas você tentou ctrl + z ou executar seu comando assim; #command &
EralpB
O comando já está em execução, então não tenho outra opção. Não tenho certeza de qual comando tentar. Eu não queria quebrar o processo atual, então não experimentei
Mirage
Devíamos esperar uma resposta mais profissional do que :) Eu quis dizer se você tivesse a chance de começar tudo de novo. (O comando e a coisa)
EralpB
O respondente aceito para esta pergunta explica as três etapas que precisam ser
seguidas
Você também pode simplesmente abrir uma segunda instância do putty e se conectar ao servidor novamente para obter outro shell. Embora a solução com ctrl+zseja ótima.
Ela782

Respostas:

207

Suspenda o processo com CTRL + Z e use o comando bgpara reiniciá-lo em segundo plano. Por exemplo:

sleep 60
^Z  #Suspend character shown after hitting CTRL+Z
[1]+  Stopped  sleep 60  #Message showing stopped process info
bg  #Resume current job (last job stopped)

Mais sobre controle de trabalho e bguso na bashpágina do manual:

JOB CONTROL
Digitar o caractere suspenso (normalmente ^ Z, Control-Z) enquanto um processo está em execução faz com que esse processo seja interrompido e retorna o controle para o bash. [...] O usuário pode então manipular o estado desse trabalho, usando o comando bg para continuar em background, [...]. A ^ Z entra em vigor imediatamente e tem o efeito colateral adicional de fazer com que a saída pendente e o início de digitação sejam descartados.

bg [ jobspec ...]
Retoma cada job jobspec suspenso em segundo plano, como se tivesse sido iniciado com &. Se jobspec não estiver presente, a noção do shell do trabalho atual é usada.

EDITAR

Para iniciar um processo em que você pode até matar o terminal e ele ainda continua em execução

nohup [command] [-args] > [filename] 2>&1 &

por exemplo

nohup /home/edheal/myprog -arg1 -arg2 > /home/edheal/output.txt 2>&1 &

Para simplesmente ignorar a saída (não muito inteligente), altere o nome do arquivo para /dev/null

Para obter a mensagem de erro definida para um arquivo diferente, altere o &1para um nome de arquivo.

Além disso: você pode usar o jobscomando para ver uma lista indexada desses processos em segundo plano. E você pode matar um processo em segundo plano executando kill %1ou kill %2com o número sendo o índice do processo.

Ed Heal
fonte
Eu tentei, mas como está gerando algo, ele voltou em primeiro plano com% mostrando a quantidade de dados carregados
Mirage
O processo gravará qualquer saída no terminal conforme você instruiu o processo a fazer isso no início. Você terá que reiniciá-lo para obter a saída para gravar no arquivo ou /dev/null. Veja a edição acima.
Ed Heal
então isso significa que, se o processo já foi iniciado, não há como redirecionar a saída
Mirage
Sim, de fato. Você não pode efetuar o processo apenas no shell do qual ele está sendo executado. Você poderia fazer um kill -9 <pid of your shelle então o processo ainda será executado e a saída será descartada - mas você terá que fazer o login novamente para iniciar um novo shell.
Ed Heal
Você também pode usar o disowncomando se precisar fazer logout de sua sessão de terminal e quiser que ele continue em execução.
Kirk Roerig