Comando de verificação de renúncia

10

Emiti a ^z; bg; disownsequência para permitir que eu fechasse uma sessão ssh na qual estou executando um processo de execução muito importante. Esse processo grava a saída de status no stderr e continua a fazê-lo mesmo após ser desconectado (verificado com lsof, o stderr fd está aberto para r / w).

Existe uma maneira de determinar que o processo foi realmente rejeitado (não recv SIGHUP se o shell recvs um)?

mikewaters
fonte
1
Gostaria de saber se isso precisa ir para unix.stackexchange.com
Rilindo
2
Apenas curioso, por que não: $ PROCESS 1 >> / root / std.out 2 >> / root / err.out &
Avery Payne

Respostas:

12

No Bash, o disowncomando emitido por si só remove processos em segundo plano (via bgou &) da tabela de tarefas ativas e marca-os para não receberem um SIGHUP no logout.

Você também pode passar um ou mais trabalhos para rejeitar, como disown 1 3. O disown -hsinalizador é útil se você deseja manter os trabalhos na tabela, mas ainda não o SIGHUP no logout.

Você pode visualizar a tabela de tarefas emitindo o jobscomando Após um plano de fundo bem-sucedido, ele será exibido [1]+ command &. Depois de recusar um trabalho, ele não deve mais ser exibido na tabela de trabalhos e não será mais eliminado no logout. Você ainda pode ver o processo de via ps ux, tope outros utilitários de visualização de processos.

Após a rejeição de um trabalho, você pode esperar que ele termine naturalmente ou enviar um sinal killpara o PID para interrompê-lo.

Como o Bash está apenas removendo o trabalho da lista de trabalhos em execução para finalizar e os identificadores de arquivo do stdout e stderr do seu terminal ainda estão abertos, você continuará recebendo a saída do trabalho até que o dispositivo do terminal seja fechado (quando você sair) .

Exemplos:

# we start a command in the background
$ cat /dev/urandom > test &
[1] 18533

# we see our command is still running
$ jobs
[1]+  Running                 cat /dev/urandom > test &

# we disown the backgrounded job
$ disown 1

# notice it is no longer in the job table
$ jobs

Normalmente, eu uso somente disownse executar um comando potencialmente de longa duração, como um rsyncou mais cptarde, e decidir que preciso fazer logout sem finalizá-lo. Se você sabe que vai executar um comando e efetuar logout, é possível capturar a saída canalizando tee-a para um arquivo, executando-a nohupou executando-a screen(o que permite retomar a propriedade do comando / encerrar posteriormente) )

Exemplos:

# capture stdout and stderr to separate logs
cat /dev/urandom >stdout.log 2>stderr.log

# capture stdout and stderr to the same log, and display to stdout as well
cat /dev/urandom 2>&1 | tee output.log

# run a command under nohup (doesn't require a disown or job control support)
nohup cat /dev/urandom </dev/null
lunixbochs
fonte
1
+1 Informativo e com exemplos. Agradável!
Andy Smith
Comentário muito informativo; você está dizendo que não é possível verificar o desapego de um processo (além de observar que ele não existe mais na tabela de tarefas)?
Mikewaters
1
quando você executa detachum trabalho em segundo plano, ele será desanexado :) não existe realmente um meio termo onde executá-lo em um processo em segundo plano não fará nada. a verificação jobsapenas verifica se você não tentou desanexar um processo parado ou algo assim.
lunixbochs