man pgrep
dit ce qui suit à propos de l'option -f
:
-f The pattern is normally only matched against the process name. When -f is set, the full command line is used.
Que signifie dire que la command line complète est utilisée?
Cela signifie que sans -f
, pgrep
ne search que l'expression regexp fournie dans les noms des commands, alors que -f
le search dans leurs arguments (où le premier argument ( argv[0]
) n'est pas nécessairement le même que le nom de la command) .
$ sleep 2000 & [1] 15768 $ pgrep 2000 $ pgrep -f 2000 15768
Et si argv[0]
est différent du nom de la command (sur Linux comme dans /proc/$pid/stat
), comme lors de l'utilisation de ARGV0
zsh
:
$ ARGV0=foo sleep 2000 & [2] 15881 $ ps -fp $! UID PID PPID C STIME TTY TIME CMD chazelas 15881 13126 0 19:55 pts/1 00:00:00 foo 2000 $ ps -o comm= $! sleep $ awk '{print $2}' /proc/$!/stat (sleep) $ pgrep foo $ pgrep sleep 15881 $ pgrep -f sleep $ pgrep -f foo 15881
Il y a beaucoup de confusion potentielle concernant le nom du process sous Unix et Linux. Il y a 3 attributes d'un process qui pourraient prétendre être le nom du process:
ps
ou trouvé dans /proc/$pid/stat
. Cependant, il convient de noter que sous Linux, il peut être modifié en utilisant prctl(PR_SET_NAME...)
. mmap
ed pour l'exécution dans le process et de preference le path tel qu'il a été appelé (pour les scripts, ce serait le path fourni dans la ligne de shebang par exemple). Sous Linux, vous pouvez l'get avec un readlink
ou /proc/$pid/exe
. Celui-là, vous ne pouvez pas changer sans appeler un autre execve
(bien que vous puissiez en théorie charger un nouvel exécutable en memory et exécuter son code sans appeler execve
, voir par exemple quelques tentatives sur un user execve ). /proc/$pid/cmdline
, mais un process peut aussi le modifier en modifiant la memory pointée par argv[0]
. Il convient également de noter qu'il y a beaucoup de variation entre les différents Unices.
quand vous ps -f
vous verrez plus de détails sur les process, y compris les commands associées et les informations de process. Lorsque vous pgrep -f
il searchra cette information supplémentaire pour correspondre à votre requête, par opposition à ce qui est affiché lorsque vous utilisez simplement ps
ou ps -e