Como faço para iniciar um processo de segundo plano a partir de um script de shell e registrar a saída do processo?

1

Eu tenho um script de shell semelhante ao seguinte:

#!/bin/bash

# Here is where I set a bunch of environment variables that are
# used by the process invoked below...

# Now I want to invoke the process in the background and redirect
# all of the output to a log file.
nohup name-of-executable > logfile.out 2>&1 &

# Finally, I record the PID of the process before the script exits.
echo $! > proc.pid

O caso de uso é que, periodicamente, alguém irá ssh nesta máquina, iniciará este processo e, em seguida, sairá da máquina. Eu só preciso ter o arquivo de log criado para que eu possa depurar quaisquer problemas encontrados durante a execução do processo.

Ao usar meu script acima, o processo é executado corretamente, o arquivo de log é criado, mas nenhuma saída é gravada no arquivo de log. Acabei de receber um arquivo de tamanho zero.

Se eu executar o comando nohup name-of-executable > logfile.out 2>&1 & diretamente da linha de comando, o processo será executado e registrará os dados conforme o esperado. Eu só não sei como fazer isso como parte de um script de shell.

    
por Del Putnam 12.04.2016 / 22:02

2 respostas

1

Que tal usar a tela em vez de nohup? Você poderia fazer um processamento em segundo plano como este

screen -d -m /bin/bash 'name-of-executable > logfile.out 2>&1'

É melhor que nohup porque permite ver o que está acontecendo com seu trabalho em segundo plano. Você pode emitir screen -ls para ver uma lista de todos os trabalhos e, em seguida, screen -r screen_identifier para ir diretamente para o shell interativo desse trabalho em segundo plano. Digite man screen para mais informações.

    
por 12.04.2016 / 23:55
1

Com base no que foi dito nos comentários, isso pode fazer o que você precisa:

#!/bin/sh

nohup sh -c "sleep 5 && ls /proc/1/fd /proc/$$ >/tmp/log 2>/tmp/log.err" &

echo $$ >>/tmp/pid_log    
wait
echo done

A saída é algo como isto:

$ grep . /tmp/log{,.err}
/tmp/log:uid_map
/tmp/log:wchan
/tmp/log.err:ls: cannot open directory /proc/1/fd: Permission denied
    
por 10.03.2017 / 19:09