O problema é que as seções de script no upstart são executadas com o sinalizador set -e. Isso significa que o shell com saída se algum erro de comando (como pgrep). A solução é adicionar um || true
após o comando pgrep.
Eu tenho um problema com os arquivos upstart do Ubuntu em / etc / init /. Eu estou tentando executar um processo se ele já não existir. Então eu escrevi um arquivo conf e comecei com "start"
Os dois arquivos a seguir são praticamente os mesmos, exceto pelo processo que está sendo pesquisado. O processo init no primeiro arquivo é sempre encontrado e algumas repetições de "1 2 4" são enviadas para $ TMPFILE como resultado.
start on filesystem and net-device-up IFACE!=lo
stop on runlevel [016]
respawn
script
TMPFILE=/var/log/tmp.log
echo 1 >> $TMPFILE
PID=$(pgrep -f "init" -o)
echo 2 >> $TMPFILE
if [ -z $PID ] ; then
echo 3 >> $TMPFILE
fi
echo 4 >> $TMPFILE
end script
Para o segundo arquivo, doesnotexist não é encontrado pelo pgrep. No entanto, apenas as repetições de "1" são enviadas para $ TMPFILE. Eu também tentei executar a parte do script separadamente, e isso gera "1 2 3 4" exatamente como esperado.
start on filesystem and net-device-up IFACE!=lo
stop on runlevel [016]
respawn
script
TMPFILE=/var/log/tmp.log
echo 1 >> $TMPFILE
PID=$(pgrep -f "doesnotexist" -o)
echo 2 >> $TMPFILE
if [ -z $PID ] ; then
echo 3 >> $TMPFILE
fi
echo 4 >> $TMPFILE
end script
O problema é que as seções de script no upstart são executadas com o sinalizador set -e. Isso significa que o shell com saída se algum erro de comando (como pgrep). A solução é adicionar um || true
após o comando pgrep.