Как получить ожидаемое имя процесса из пути к исполняемому файлу в файле .desktop

Jun 10 2020

Я читаю файлы .desktop, найденные в /usr/share/applications, и оказывается, что НЕКОТОРЫЕ не используют то же имя процесса, что и исполняемый файл (большинство).

Есть ли способ узнать, что имя процесса будет?

Пример:

Файл 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, он возвращает ноль.

Но когда я запускаю pidof chrome, он возвращает все PID

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

Есть ли лучший способ найти PID?

Обратите внимание, что я ДОЛЖЕН выполнять поиск по информации, найденной в файле .desktop. (длинная история)

Спасибо

Ответы

1 Ravexina Jun 10 2020 at 04:27

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

Я не уверен, как вы можете получить информацию только из desktopфайла, однако одним из решений может быть его запуск...

Обратите внимание, что у меня нет google-chrome, поэтому в моем примере я использую хром.

# 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
1 xenoid Jun 10 2020 at 04:48

Что, вероятно, происходит здесь, так это то, что исходный исполняемый файл использует exec...()системный вызов (*) для замены всего своего кода новым исполняемым файлом и параметрами, и тот же самый идентификатор процесса будет соответствовать этому новому коду и будет указан как таковой ps, так что исходный исполняемый файл исчезает из списка процессов. Это часто используется для настройки среды для другого исполняемого файла.

(*) Или execвстроенный, если это сценарий оболочки