
Existe uma maneira de descobrir qual programa está executando meu script?
Estou executando o I3 como meu gerenciador de janelas e quero usar sxkhd
as 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 sxkhd
processos 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 $PPID
variá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 xeyes
um 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 xeyes
por um wrapper de script:
sudo cp ./xeyes "$(dirname $(command -v xeyes.orig))"
Ligue xeyes
normalmente:
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 $PPID
variá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, getppid
em perl, os.getppid
em python, etc.).
Depois de obter o PID do processo pai, o mapeamento dele para um executável será específico do sistema. ps
lhe 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.