2010-11-18 44 views
8

Je dois faire un script qui obtient de l'utilisateur ce qui suit:kill processus avec python

1) Nom du processus (sous Linux).

2) Le nom du fichier journal que ce processus lui écrit.

Il doit tuer le processus et vérifier que le processus est arrêté. Modifiez le nom du fichier journal en un nouveau nom de fichier avec l'heure et la date. Puis réexécutez le processus, vérifiez qu'il est dans l'ordre il continuera à écrire dans le fichier journal.

Merci d'avance pour l'aide.

+0

noms de processus ne sont pas uniques sur linux. Que faire s'il y a plus d'un processus avec le même nom? De même, comment le système sait-il comment redémarrer le processus? Vous semblez dupliquer la fonctionnalité de logrotate .... – Spacedman

+0

Comment pouvez-vous être sûr que le processus tué écrit réellement dans ce fichier journal? Semble dangereux de supposer que l'utilisateur ne fera pas d'erreur. Ces erreurs créent-elles des situations critiques non désirées? – Danosaure

+0

Bien que cela soit vrai à propos du sous-processus, pour des commandes très simples où l'utilisateur n'a pas besoin de la complexité supplémentaire des sous-processus utilisant os.system est en fait plus facile à coder et à comprendre. Pour mon travail, j'ai utilisé os.system sans aucun problème. –

Répondre

17

Vous pouvez récupérer l'ID du processus (PID) étant donné que ce nom en utilisant la commande pgrep comme ceci:

import subprocess 
import signal 
import os 
from datetime import datetime as dt 


process_name = sys.argv[1] 
log_file_name = sys.argv[2] 


proc = subprocess.Popen(["pgrep", process_name], stdout=subprocess.PIPE) 

# Kill process. 
for pid in proc.stdout: 
    os.kill(int(pid), signal.SIGTERM) 
    # Check if the process that we killed is alive. 
    try: 
     os.kill(int(pid), 0) 
     raise Exception("""wasn't able to kill the process 
          HINT:use signal.SIGKILL or signal.SIGABORT""") 
    except OSError as ex: 
     continue 

# Save old logging file and create a new one. 
os.system("cp {0} '{0}-dup-{1}'".format(log_file_name, dt.now())) 

# Empty the logging file. 
with open(log_file_name, "w") as f: 
    pass 

# Run the process again. 
os.sytsem("<command to run the process>") 
# you can use os.exec* if you want to replace this process with the new one which i think is much better in this case. 

# the os.system() or os.exec* call will failed if something go wrong like this you can check if the process is runninh again. 

espère que cela peut aider

2

Si vous savez comment le faire dans le terminal, alors vous pouvez utiliser les éléments suivants:

import os 
os.system("your_command_here; second_command; third; etc") 

Alors que vous finissez par avoir une sorte de mini-script shell dans python. Je voudrais également envisager de faire ce script shell seul, puis l'appeler à partir de python:

import os 
os.system("path/to/my_script.sh") 

Cheers!

+0

J'aime la simplicité, et avoir une chose à ajouter 'os.system' renvoie le code de statut de sortie afin que vous puissiez vérifier le succès du processus et gérer les erreurs par code. – snarkyname77

+0

En général, les programmeurs ne sont plus encouragés à utiliser os.system, car subprocess.Popen offre beaucoup plus d'options et de support. En particulier, il gère beaucoup mieux les arguments de ligne de commande et permet la sortie de tuyauterie. –

+0

Merci James, je vais passer au sous-processus :) – Morlock