ターミナルコマンドを使用してログイン後に最近実行されているアプリケーションとプロセスを確認するにはどうすればよいですか。
次のスクリプトは、すべてのプロセスをリストし、それらを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(別のプロセス名を持っている可能性があります)を介して開始されたアプリケーションをトレースして認識します。例外は常に可能ですが、今ではまれです
通常、ps
コマンドで実行されます。
man ps
と入力すると、このコマンドのマニュアルが表示され、必要なフラグを確認できます。たとえば、ps -e
は、システムで実行中のすべてのプロセスをリストします。
別のコマンドはtop
で、実行中のすべてのプロセスのアクティブなビューを表示します。