objectif
Identifier précisément des processus et les arrêter proprement sans recourir à “ps | grep”, avec des filtres fiables (utilisateur, nom exact, commande complète).
code minimal
# lister les PIDs de "node" avec commande affichée
pgrep -fl node
# terminer proprement (SIGTERM) tous les "app.js" correspondant à la commande complète
pkill -TERM -f 'app.js'
utilisation
# ne cibler que vos processus (sécurité)
pgrep -u "$USER" -fl 'python'
# correspondance exacte du nom (évite les faux positifs)
pgrep -x 'nginx'
# afficher seulement les PIDs (pour enchaîner)
pgrep -f 'my-service --port 8080'
# tuer proprement puis vérifier que tout est terminé
pkill -TERM -x 'my-service'
sleep 1
pgrep -x 'my-service' >/dev/null || echo "arrêté"
# envoyer un signal spécifique (ex: USR1 pour rotation de logs)
pkill -USR1 -x 'nginx'
# cibler uniquement le plus récent/la plus ancienne occurrence
pkill -n -TERM -x 'my-worker' # plus récent
pkill -o -TERM -x 'my-worker' # plus ancien
# limiter à un utilisateur précis (ex: service "app" lancé par appuser)
pkill -u appuser -TERM -f 'bin/app'
# dry-run lisible: afficher ce qui serait tué (BSD/macOS: -e montre les noms)
pgrep -fl 'app' && echo "→ pkill -TERM -f 'app'"
# en dernier recours, forcer (SIGKILL) puis revalider
pkill -KILL -x 'my-service'
pgrep -x 'my-service' >/dev/null || echo "tué"
variante(s) utile(s)
# protéger la production: ne tuer que dans un dossier spécifique (filtre par cmdline)
pkill -TERM -f '/srv/myapp/current/bin/server'
# stopper un port occupé par un binaire donné (combinez avec lsof)
pids="$(lsof -tiTCP:8080 -sTCP:LISTEN)"; [ -n "$pids" ] && pkill -TERM -P $pids 2>/dev/null || true
# macOS/BSD compat: pkill -G pour filtrer par groupe, -I pour session ID (selon OS)
# Linux: utilisez -c pour compter, pratique en scripts
pgrep -c -x 'cron' # nombre d'instances de cron
notes
- évitez
ps aux | grep ... | grep -v grep(faux positifs, conditions de course).pgrep/pkillsont atomiques et sûrs. -xcorrespond au nom exact,-frecherche dans la commande complète (utile pour différencier des variantes).- privilégiez
SIGTERMpuis vérifiez; n’utilisezSIGKILLqu’en ultime recours. - filtrez par utilisateur (
-u) pour éviter d’affecter des services système. - les options varient légèrement entre Linux et BSD/macOS; vérifiez
man pgrep/man pkillsur votre système.