← retour aux snippets

pgrep/pkill: trouver et arrêter des processus proprement

Lister et terminer des processus sans 'ps | grep', avec filtres sûrs et signaux contrôlés.


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/pkill sont atomiques et sûrs.
  • -x correspond au nom exact, -f recherche dans la commande complète (utile pour différencier des variantes).
  • privilégiez SIGTERM puis vérifiez; n’utilisez SIGKILL qu’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 pkill sur votre système.