Verifique o comando de rejeição

10

Eu emiti a seqüência ^z; bg; disown para permitir que eu feche uma sessão ssh na qual estou executando um processo muito importante e de longa duração. Esse processo grava a saída de status para stderr, e continua a fazê-lo mesmo depois de ser desanexado (verificado com lsof, o stderr fd está aberto para r / w).

Existe uma maneira de determinar que o processo foi de fato renegado (não irá registrar SIGHUP se o shell receber um)?

    
por mikewaters 01.12.2011 / 22:39

1 resposta

12

No Bash, o comando disown emitido por si removerá os processos em segundo plano (via bg ou & ) da tabela de tarefas ativa e os marcará para não receber um SIGHUP ao efetuar logout.

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

Você pode visualizar a tabela de trabalhos emitindo o comando jobs . Após um plano de fundo bem-sucedido, ele mostrará [1]+ command & . Depois de rejeitar um trabalho, ele não deve mais ser exibido na tabela de tarefas e não deve mais ser eliminado no logout. Ainda é possível visualizar o processo via ps ux , top e outros utilitários de visualização de processos.

Após o cancelamento de um trabalho, você pode esperar que ele termine naturalmente ou envie um sinal via kill para o PID para interrompê-lo.

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

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

Eu costumo usar apenas disown se eu executar um comando potencialmente longo como rsync ou cp e depois decidir que eu preciso fazer logout sem terminá-lo. Se você sabe que vai executar um comando e efetuar logout, pode capturar a saída por canalização ou tee it em um arquivo, executá-lo com nohup ou executá-lo em screen (o que permite para retomar a posse do comando / terminar depois).

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
    
por 02.12.2011 / 00:26

Tags