Cách lấy tên quy trình dự kiến từ đường dẫn thực thi trong tệp .desktop
Tôi đang đọc qua các tệp .desktop được tìm thấy trong/usr/share/applications và có vẻ như MỘT SỐ không chia sẻ tên quy trình giống như tệp thực thi (hầu hết đều có).
Có cách nào để tìm ra rằng tên quy trình sẽ là?
Thí dụ:
Tệp .desktop của Chrome
[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;
Khi tôi chạy pidof google-chrome-stablenó trả về null.
Nhưng khi tôi chạy pidof chromenó trả về tất cả các PID
879321 879303 805004 755066 693852 693837 693796 688198 624316 624289 3194 2788 2762 2734 2685 2677 2641 2637 2620 2613 2611 2611
Có cách nào tốt hơn để tìm PID không?
Xin lưu ý rằng TÔI PHẢI tìm kiếm từ thông tin có trong tệp .desktop. (câu chuyện dài)
Cảm ơn
Trả lời
Nó phụ thuộc vào Execdòng, nó có thể là một tập lệnh shell đang chạy một tệp thực thi khác hoặc nó có thể là một liên kết hoặc thậm chí là một tệp thực thi sinh ra một tệp thực thi khác.
Tôi không chắc làm cách nào bạn chỉ có thể lấy thông tin từ desktoptệp, tuy nhiên một giải pháp có thể là chạy nó...
Lưu ý rằng tôi không có google-chrome nên tôi sử dụng crom trong ví dụ của mình.
# 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
Điều có thể xảy ra ở đây là tệp thực thi ban đầu sử dụng một exec...()lệnh gọi hệ thống (*) để thay thế tất cả mã của nó bằng một tệp thực thi mới và các tham số cũng như id tiến trình tương tự sẽ tương ứng với mã mới đó và được liệt kê như vậy bởi ps, sao cho mã ban đầu thực thi biến mất khỏi danh sách quá trình. Điều này thường được sử dụng để thiết lập một môi trường cho một tệp thực thi khác.
(*) Hoặc execnội trang nếu nó là shell script