如何从 .desktop 文件中的可执行路径获取预期的进程名称

如何从 .desktop 文件中的可执行路径获取预期的进程名称

我正在阅读 /usr/share/applications 中找到的 .desktop 文件,似乎有些文件与可执行文件不共享相同的进程名称(大多数)。

有没有办法找到进程名称?

例子:

Chrome .desktop 文件

[Desktop Entry]
Version=1.0
Name=Google Chrome
Exec=/usr/bin/google-chrome-stable %U
StartupNotify=true
Terminal=false
Icon=google-chrome
Type=Application
Categories=Network;WebBrowser;
MimeType=application/pdf;application/rdf+xml;application/rss+xml;application/xhtml+xml;application/xhtml_xml;application/xml;image/gif;image/jpeg;image/png;image/webp;text/html;text/xml;x-scheme-handler/ftp;x-scheme-handler/http;x-scheme-handler/https;
Actions=new-window;new-private-window;

当我运行时pidof google-chrome-stable它返回 null。

但是当我运行时pidof chrome它会返回所有 PID

879321 879303 805004 755066 693852 693837 693796 688198 624316 624289 3194 2788 2762 2734 2685 2677 2641 2637 2620 2613 26 11 2601

有没有更好的方法来找到PID?

请注意,我必须从 .desktop 文件中找到的信息进行搜索。 (很长的故事)

谢谢

答案1

这取决于行Exec,它可能是运行另一个可执行文件的 shell 脚本,也可能是一个链接,甚至是生成另一个可执行文件的可执行文件。

我不确定如何仅从文件中获取信息,desktop但一种解决方案可能是运行它......

请注意,我没有 google-chrome,因此我在示例中使用 chromium。

# Extract the command from desktop file
$ CMD=$(grep -Po "(?<=^Exec=).+\s" /usr/share/applications/chromium.desktop)
$ echo $CMD
/usr/bin/chromium

# Run it
$ CMD &

# Get the PID
$ PID=$(echo $!)
$ echo $PID
5146

# Get process name from PID
$ ps --no-header -p $PID -o comm
chromium

# Get the complete command line + arguments
ps --no-header -p $PID -o cmd
/usr/lib/chromium/chromium --show-component-extension-options --enable-gpu-rasterization

# Terminate process
kill -SIGTERM $PID

答案2

这里可能发生的情况是,初始可执行文件使用exec...()系统调用(*)将其所有代码替换为新的可执行文件和参数,并且完全相同的进程 ID 将对应于该新代码并通过 列出ps,以便初始可执行文件可执行文件从进程列表中消失。这通常用于为另一个可执行文件设置环境。

(*)exec如果是 shell 脚本,则为内置命令

相关内容