![如何找到哪个程序正在执行给定的程序?](https://linux22.com/image/170222/%E5%A6%82%E4%BD%95%E6%89%BE%E5%88%B0%E5%93%AA%E4%B8%AA%E7%A8%8B%E5%BA%8F%E6%AD%A3%E5%9C%A8%E6%89%A7%E8%A1%8C%E7%BB%99%E5%AE%9A%E7%9A%84%E7%A8%8B%E5%BA%8F%EF%BC%9F.png)
有没有办法找出哪个程序正在执行我的脚本?
我正在运行 I3 作为我的窗口管理器,我想使用sxkhd
bynd 键而不是 i3config,但有些东西不断取代我的 sxkhd bynds,所以我想跟踪它是什么。也许我可以使用,strace
但我还没弄清楚如何使用。
感谢您的解答
编辑:
原来我没有杀死我的旧sxkhd
进程,所以他们对执行我的脚本有罪
,但我仍然很好奇如何跟踪这些执行
答案1
$PPID
在 Linux 上,您可以从变量或 /proc/pid/status获取父进程的 PID 。例如,在守护进程的情况下,父进程并不总是调用进程,但通常是。话虽这么说,您可以将每个程序转换为包装器,该包装器首先将其父进程的 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 中。如果您从命令行启动它,它将是您的 shell 的 PID,例如 /bin/bash。
答案2
在 Linux 上,从 shell 中:
readlink "/proc/$PPID/exe"
在任何标准 shell 中,$PPID
变量都指的是父进程。在 C 语言中,您可以使用getppid()
.大多数语言都有一种方法来检索它(例如,getppid
在 perl、os.getppid
python 等中)。
一旦获得父进程的 PID,将其映射到可执行文件必然是系统特定的。ps
会告诉您进程名称或命令行参数,但这些是不可靠的,因为它们(通常)不包含完整路径,并且可以由进程本身或以同一用户身份运行的任何其他进程进行修改。
在 Linux 上,进程的可执行文件由 指向/proc/<pid>/exe
。这是一个“神奇”的符号链接:即使原始可执行文件被删除或重命名,您仍然可以读取它(例如复制到其他地方)或再次执行它。