Как узнать, какая программа выполняет заданную программу?

Как узнать, какая программа выполняет заданную программу?

Есть ли способ узнать, какая программа выполняет мой скрипт?

Я использую I3 в качестве оконного менеджера и хочу использовать sxkhdbynd keys вместо i3config, но что-то продолжает заменять мои sxkhd bynds, поэтому я хочу отследить, что это. Может быть, я мог бы использовать, straceно я не понял как.

Спасибо за ответы

EDIT:
оказалось, что я не завершил свои старые sxkhdпроцессы, так что они были виновны в выполнении моего скрипта
, но мне все еще интересно, как я могу отследить эти выполнения

решение1

В Linux вы можете получить PID родительского процесса из $PPIDпеременной или /proc/pid/status. Родительский процесс не всегда является вызывающим процессом, как в случае демонов, например, но обычно это так. При этом вы можете преобразовать каждую программу в оболочку, которая сначала запишет PID родительского процесса в файл, а затем выполнит оригинальный двоичный файл. Я не использую sxkhd, но поскольку вы используете X11, давайте использовать xeyes в качестве примера. Создайте xeyesскрипт со следующим содержимым и сделайте его исполняемым:

#!/usr/bin/env sh

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

Теперь переименуйте исходный двоичный файл xeyes в xeyes.orig:

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

Заменить оригинал xeyesоболочкой скрипта:

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

Звоните xeyesкак обычно:

xeyes

Теперь при каждом запуске xeyes PID его родительского процесса будет добавлен в /tmp/XEYES_RUN. Если вы запустите его из командной строки, то это будет PID вашей оболочки, например /bin/bash.

решение2

Из оболочки в Linux:

readlink "/proc/$PPID/exe"

В любой стандартной оболочке $PPIDпеременная ссылается на родительский процесс. В C вы можете получить ее с помощью getppid(). Большинство языков имеют способ получить ее (например, getppidв perl, os.getppidв python и т. д.).

После того, как вы получили PID родительского процесса, сопоставление его с исполняемым файлом обязательно будет специфичным для системы. psсообщит вам имя процесса или аргументы командной строки, но этоненадежный, поскольку они (как правило) не включают полный путь и могут быть изменены самим процессом или любым другим процессом, запущенным от имени того же пользователя.

В Linux на исполняемый файл процесса указывает /proc/<pid>/exe. Это «волшебная» символическая ссылка: даже если исходный исполняемый файл был удален или переименован, вы все равно можете его прочитать (например, скопировать в другое место) или выполнить снова.

Связанный контент