
Есть ли способ узнать, какая программа выполняет мой скрипт?
Я использую I3 в качестве оконного менеджера и хочу использовать sxkhd
bynd 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
. Это «волшебная» символическая ссылка: даже если исходный исполняемый файл был удален или переименован, вы все равно можете его прочитать (например, скопировать в другое место) или выполнить снова.