Como monitorar o último PID atribuído pelo kernel?

3

Para monitorar a criação de processos, eu gostaria de escrever periodicamente o último PID atribuído pelo kernel a qualquer processo no sistema (não apenas processos criados pelo programa de monitoramento PID) com um registro de data e hora. para um arquivo (usando um daemon para evitar a criação de processos extras). Qualquer linguagem seria boa, mas tenho a sensação de que isso deve ser possível (até mesmo fácil) no shell POSIX.

    
por l0b0 14.05.2013 / 16:44

2 respostas

4

Isso salva o timestamp e o último PID para arquivar cada segundo no 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

Problemas:

  • Não tenho certeza se ns_last_pid é o número correto. A documentação não está clara para mim:

    The last pid allocated in the current (the one task using this sysctl lives in) pid namespace.

  •   
  • /proc/sys/kernel/ns_last_pid é apenas disponível no Linux 3.3 e mais recente
  •   
  • POSIX read não tem a opção -t .
  •   
  • Não é possível usar sleep , cat ou outros não-incorporados, pois eles usariam PIDs adicionais.
  •   
por 14.05.2013 / 16:44
2

POSIX não fornece uma maneira de obter o último PID atribuído pelo kernel, então não pode haver uma resposta portátil.

Aqui está um oneliner que deve funcionar em todos os sistemas que implementam o dtrace (Solaris, FreeBSD, NetBSD, Mac OS X, Oracle Linux com o mais recente UEK e outros como sistemas operacionais baseados no Illumos, Linux com 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

Editar:

No Linux, uma alternativa seria usar systemtap se disponível com o qual este comando (não testado) deveria fornecer uma saída similar:

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