web-dev-qa-db-fra.com

Obtenir la liste des processus et applications en cours d'exécution

Comment voir quelle application et quels processus sont en cours d'exécution récemment après la connexion à l'aide de la commande terminal.

2
TechJhola

Le script suivant répertorie tous les processus et les scinde en applications et en autres processus .

En tant que définition pour une application, je pratique que le processus soit lancé à partir d'un fichier .desktop (car pratiquement toutes les applications sont représentées par un fichier .desktop) et que le fichier .desktop apparaît dans le tableau de bord. (le fichier .desktop n'a pas de ligne: NoDisplay=true).

Travail à faire:

Le script, tel quel, tire le nom du processus de l'application de la (dernière section de) de la commande, trouvée dans le fichier du bureau, ainsi que des informations contenues dans les liens symboliques possibles auxquels elle pourrait faire référence (par exemple, dans le cas de LibreOffice> nom du processus: soffice.bin). Toutefois, dans certains cas, une application s'exécute à partir d'un script distant, appelé à partir du fichier .desktop. Dans ce cas, le processus ne sera pas reconnu comme une application.

Le script donne une sortie comme:

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

etc...

Le script

#!/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()

Comment utiliser

Copiez le script dans un fichier vide, enregistrez-le sous le nom processes.py, exécutez-le à l'aide de la commande suivante:

python3 /path/to/processes.py

Edit: mise à jour ma réponse, réécriture du script.

Améliorations:

  • (beaucoup) de meilleures performances

  • , le script trace et reconnaît maintenant les applications, lancées via des liens symboliques (qui peuvent avoir un autre nom de processus). Bien que des exceptions soient toujours possibles, elles devraient être rares maintenant.

3
Jacob Vlijm

Généralement, la commande ps le fait.

Si vous tapez man ps , vous obtiendrez le manuel de cette commande et vous pourrez y vérifier l’indicateur dont vous aurez besoin. Par exemple, _ps -e_ liste tous les processus en cours d'exécution sur le système.

Une autre commande est top qui affichera une vue active de tous les processus en cours.

6
wmarchewka