web-dev-qa-db-ja.com

実行中のプロセスとアプリケーションのリストの取得

ターミナルコマンドを使用してログイン後に最近実行されているアプリケーションとプロセスを確認するにはどうすればよいですか。

2
TechJhola

次のスクリプトは、すべてのプロセスをリストし、それらをapplicationsおよびotherプロセスに分割します

アプリケーションの定義として、プロセスは.desktopファイルから開始され(実際にはすべてのアプリケーションは.desktopファイルで表されるため)、.desktopファイルがDashに表示されるようにします。 (.desktopファイルには行がありません:NoDisplay=true)。

やるべきこと:

スクリプトは、そのままで、デスクトップファイルにあるコマンド(の最後のセクション)から、および参照する可能性のあるシンボリックリンクにある情報(たとえば、LibreOfficeの場合)から、アプリケーションのプロセス名を導き出します。プロセス名:soffice.bin)。ただし、場合によっては、アプリケーションは.desktopファイルから呼び出されるリモートスクリプトから実行されます。これらの場合、プロセスはアプリケーションとして認識されません。

スクリプトは次のような出力を提供します。

Processes, related to applications:
  PID TTY          TIME CMD
 1933 ?        00:03:55 firefox
18091 ?        00:00:00 dia
18162 ?        00:00:01 soffice.bin
31167 ?        00:00:06 alarm-clock-app
31174 ?        00:00:09 nautilus
31301 ?        00:00:20 dropbox
31998 ?        00:01:35 idle3

Other processes:
  PID TTY          TIME CMD
    1 ?        00:00:01 init
    2 ?        00:00:00 kthreadd
    3 ?        00:00:02 ksoftirqd/0
    5 ?        00:00:00 kworker/0:0H
    7 ?        00:00:15 rcu_sched
    8 ?        00:00:08 rcuos/0

等...

スクリプト

#!/usr/bin/env python3

import os
import subprocess

def createlist_appcommands():
    dtfile_dir = "/usr/share/applications"
    dtfile_list = [item for item in os.listdir(dtfile_dir) if item.endswith(".desktop")]
    commands = []
    for item in dtfile_list:
        try:
            with open(dtfile_dir+"/"+item) as data:
                searchlines = data.readlines()
                command = [line for line in searchlines if line.startswith("Exec=")
                           and not "NoDisplay=true\n" in searchlines
                            ][0].replace("Exec=", "").replace("\n", "").split("/")[-1].split(" ")[0]
            commands.append(command)
        except Exception:
            pass
    return commands + [trace_symlinks(item) for item in commands if not trace_symlinks(item)== None]

def trace_symlinks(command):
    target = subprocess.Popen(["which", command], stdout=subprocess.PIPE)
    location = (target.communicate()[0].decode("utf-8")).split("\n")[0]                                                          
    check_filetype = subprocess.Popen(["file", location], stdout=subprocess.PIPE)
    filetype = (check_filetype.communicate()[0].decode("utf-8")).split("\n")[0]
    if "symbolic link" in filetype:
        return filetype.split("/")[-1].replace("' ", "")
    else:
        pass

def createlist_runningprocs():
    processesb = subprocess.Popen(["ps", "-e"], stdout=subprocess.PIPE)
    process_listb = (processesb.communicate()[0].decode("utf-8")).split("\n")
    linked_commands = [(item, item[24:]) for item in process_listb][1:]
    applist = createlist_appcommands()
    print("Processes, related to applications:\n  PID TTY"+" "*10+"TIME CMD")
    matches = []
    for item in applist:
        for i in range(0, len(linked_commands)):
            if item[:15] in linked_commands[i][1] and len(item[:15])/len(linked_commands[i][1]) > 0.5:
                matches.append(i)
    matches = sorted(matches)
    for i in range(0, len(linked_commands)):
        if i in matches:
            print(linked_commands[i][0])
    print("\nOther processes:\n  PID TTY"+" "*10+"TIME CMD")
    for i in range(0, len(linked_commands)):
        if not i in matches:
            print(linked_commands[i][0])

createlist_runningprocs()

使用方法

空のファイルにスクリプトをコピーし、processes.pyとして保存し、コマンドで実行します:

python3 /path/to/processes.py

編集:回答を更新し、スクリプトを書き直しました。

改善:

  • (はるか)パフォーマンスの向上

  • スクリプトは、symlinks(別のプロセス名を持っている可能性があります)を介して開始されたアプリケーションをトレースして認識します。例外は常に可能ですが、今ではまれです

3
Jacob Vlijm

通常、psコマンドで実行されます。

man ps と入力すると、このコマンドのマニュアルが表示され、必要なフラグを確認できます。たとえば、ps -eは、システムで実行中のすべてのプロセスをリストします。

別のコマンドはtopで、実行中のすべてのプロセスのアクティブなビューを表示します。

6
wmarchewka