Veuillez expliquer l'option -f dans pgrep

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:

  • Nom de base de l'exécutable transmis au dernier appel système execve (2) effectué par le process. Sous Linux, il est utilisé pour initialiser le nom du process, comme indiqué par 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...) .
  • tout path vers l'exécutable qui est actuellement 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 ).
  • Le premier argument est passé le long de l'appel système execve. Par convention, cet argument est destiné à dire à l'application son nom pour lui faire savoir comment se comporter en conséquence, c'est souvent ce que l'on entend par le nom du process. Sur Linux, il se trouve dans /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