Avoir un script comme ci-dessous:
#!/bin/bash
#
# exécuter ce script. Ne l'exécutez pas s'il est déjà en cours d'exécution.
#
PIDFILE=/tmp/script.pid
LOGFILE=script.log
if [[ -f $PIDFILE ]]; then
echo "$PIDFILE existe. Ne pas exécuter..."
exit 0
fi
sleep 10m >> $LOGFILE 2>&1 &
PID=$!
echo $PID > $PIDFILE
trap "echo Sortie...; rm $PIDFILE; exit $?" INT TERM EXIT KILL
wait $PID
J'invoke ce script comme ci-dessous:
timeout 2m ./test_script
En cas de délai d'attente ou de ctrl+c, le script imprime "Sortie" deux fois.
# timeout 2m ./test_script
^CSortie...
Sortie...
rm: impossible de supprimer `/tmp/script.pid': Aucun fichier ou dossier de ce type
Voici la sortie de strace et plus de données:
# ps -ef | grep -v grep | egrep -i "sleep|time"
root 8571 4690 0 12:17 pts/0 00:00:00 timeout 2m ./test_script
root 8572 8571 0 12:17 pts/0 00:00:00 /bin/bash ./test_script
root 8573 8572 0 12:17 pts/0 00:00:00 sleep 10m
# cat /tmp/script.pid
8573
# strace -p 8571
Process 8571 attached - interrupt to quit
wait4(-1, 0x7fffc43fad4c, 0, NULL) = ? ERESTARTSYS (To be restarted)
--- SIGINT (Interrupt) @ 0 (0) ---
kill(0, SIGINT) = 0
kill(0, SIGCONT) = 0
--- SIGCONT (Continued) @ 0 (0) ---
rt_sigreturn(0) = 61
--- SIGINT (Interrupt) @ 0 (0) ---
rt_sigreturn(0x2) = 61
wait4(-1, [{WIFEXITED(s) && WEXITSTATUS(s) == 0}], 0, NULL) = 8572
--- SIGCHLD (Child exited) @ 0 (0) ---
close(1) = 0
close(2) = 0
exit_group(0) = ?
Process 8571 detached
Est-ce que quelqu'un pourrait gentiment m'aider à comprendre pourquoi le script intercepte le signal deux fois pour imprimer "Sortie..." 2 fois ?