Para usar um arquivo pid para garantir a execução única de um programa, pensei que quando um processo terminar de executar o programa, ele deve remover o arquivo pid, até que eu saiba quando ele estiver lendo link :
#!/bin/bash
mkdir -p "$HOME/tmp"
PIDFILE="$HOME/tmp/myprogram.pid"
if [ -e "${PIDFILE}" ] && (ps -u $(whoami) -opid= |
grep -P "^\s*$(cat ${PIDFILE})$" &> /dev/null); then
echo "Already running."
exit 99
fi
/path/to/myprogram > $HOME/tmp/myprogram.log &
echo $! > "${PIDFILE}"
chmod 644 "${PIDFILE}"
Here's how it works: The script first checks to see if the PID file exists ("
[ -e "${PIDFILE}" ]
". If it does not, then it will start the program in the background, write its PID to a file ("echo $! > "${PIDFILE}"
"), and exit. If the PID file instead does exist, then the script will check your own processes ("ps -u $(whoami) -opid=
") and see if you're running one with the same PID ("grep -P "^\s*$(cat ${PIDFILE})$"
"). If you're not, then it will start the program as before, overwrite the PID file with the new PID, and exit. I see no reason to modify the script
O script acima assume que nenhum pid é reciclado?
Pode acontecer que um processo termine a execução do programa e seu pid seja reutilizado por um novo processo executando um programa diferente? Nesse caso, o script citado irá falsamente pensar que um processo está executando o programa.
Obrigado.