Como descobrir qual programa está executando determinado programa?

Como descobrir qual programa está executando determinado programa?

Existe uma maneira de descobrir qual programa está executando meu script?

Estou executando o I3 como meu gerenciador de janelas e quero usar sxkhdas chaves bynd em vez do i3config, mas algo continua substituindo meus bynds sxkhd, então quero rastrear o que é. Talvez eu pudesse usar strace, mas não descobri como.

Obrigado pelas respostas

EDIT:
descobri que não eliminei meus sxkhdprocessos antigos, então eles eram culpados por executar meu script
, mas ainda estou curioso para saber como rastrear essas execuções

Responder1

No Linux você pode obter um PID do processo pai da $PPIDvariável ou /proc/pid/status. O processo pai nem sempre é um processo de chamada no caso de daemons, por exemplo, mas geralmente é. Dito isto, você pode converter cada programa em um wrapper que primeiro registrará o PID de seu processo pai em um arquivo e depois executará um binário original. Eu não uso o sxkhd, mas como você usa o X11, vamos usar o xeyes como exemplo. Crie xeyesum script com o seguinte conteúdo e torne-o executável:

#!/usr/bin/env sh

printf "PPID: %d\n" "$PPID" >> /tmp/XEYES_RUN
xeyes.orig "$@"

Agora renomeie um binário xeyes original para xeyes.orig:

sudo mv "$(command -v xeyes)" "$(dirname $(command -v xeyes))"/xeyes.orig

Substitua o original xeyespor um wrapper de script:

sudo cp ./xeyes "$(dirname $(command -v xeyes.orig))"

Ligue xeyesnormalmente:

xeyes

Agora, toda vez que você executar xeyes, o PID de seu processo pai será anexado a /tmp/XEYES_RUN. Se você iniciá-lo a partir da linha de comando, será o PID do seu shell, por exemplo /bin/bash.

Responder2

Do shell, no Linux:

readlink "/proc/$PPID/exe"

Em qualquer shell padrão, a $PPIDvariável refere-se ao processo pai. Em C, você pode obtê-lo com getppid(). A maioria das linguagens tem uma maneira de recuperá-lo (por exemplo, getppidem perl, os.getppidem python, etc.).

Depois de obter o PID do processo pai, o mapeamento dele para um executável será específico do sistema. pslhe dirá o nome do processo ou os argumentos da linha de comando, mas esses sãonão confiável, pois (geralmente) não incluem o caminho completo e podem ser modificados pelo próprio processo ou por qualquer outro processo executado como o mesmo usuário.

No Linux, o executável de um processo é apontado por /proc/<pid>/exe. Esse é um link simbólico "mágico": mesmo que o executável original tenha sido removido ou renomeado, você ainda poderá lê-lo (por exemplo, para copiá-lo em outro lugar) ou executá-lo novamente.

informação relacionada