Comment surveiller le dernier PID assigné par le kernel?

Pour surveiller la création de process, j'aimerais écrire périodiquement le dernier PID atsortingbué par le kernel à n'importe quel process du système (pas seulement les process créés par le programme de surveillance PID) avec un horodatage dans un file (en utilisant un démon pour éviter de créer tout process supplémentaire). Toute langue serait bien, mais j'ai le sentiment que cela devrait être possible (même facile) dans le shell POSIX.

Cela enregistre l'horodatage et le dernier PID à déposer chaque seconde dans Bash:

if [ -r /proc/sys/kernel/ns_last_pid ] then while true do while read do if [ "$REPLY" != "$old" ] then printf '%(%s)T %d\n' -1 "$REPLY" old="$REPLY" fi done < /proc/sys/kernel/ns_last_pid read -t 1 || true done > pids.log fi 

Problèmes:

  • Je ne suis pas sûr si ns_last_pid est le bon numéro. La documentation n'est pas claire pour moi:

Le dernier pid alloué dans le courant (la seule tâche utilisant ce sysctl habite) pid namespace.

  • /proc/sys/kernel/ns_last_pid est uniquement disponible sous Linux 3.3 et plus récent
  • La read POSIX n'a pas l'option -t .
  • Ne peut pas utiliser le sleep , le cat ou d'autres non-builtins, car ils utiliseraient des PID supplémentaires.
  • POSIX ne fournit pas un moyen d'get le dernier PID assigné par le kernel afin qu'il ne puisse pas y avoir de réponse portable.

    Voici un oneliner qui devrait fonctionner sur tous les systèmes qui implémentent dtrace (Solaris, FreeBSD, NetBSD, Mac OS X, Oracle Linux avec le dernier UEK, et d'autres comme les systèmes d'exploitation basés sur Illumos, Linux avec dtrace4linux )

     # dtrace -qn 'proc:::exec-success { printf("%Y - %d\n",walltimestamp,pid); }' 2013 May 15 00:48:47 - 1276 2013 May 15 00:48:49 - 1277 2013 May 15 00:48:52 - 1278 

    Modifier:

    Sous Linux, une alternative serait d'utiliser systemtap si disponible avec lequel cette command (non testée) devrait fournir une sortie similaire:

     # stap -e 'probe syscall.execve { printf("%s - %d\n",ctime(gettimeofday_s()),pid()); }'