убить процесс с питоном - PullRequest
8 голосов
/ 18 ноября 2010

Мне нужно сделать скрипт, который получает от пользователя следующее:

1) Имя процесса (в Linux).

2) Имя файла журнала, который этот процесс записывает в него.

Необходимо завершить процесс и убедиться, что процесс не работает.Измените имя файла журнала на новое имя файла с указанием времени и даты.А затем снова запустите процесс, убедитесь, что он работает, чтобы продолжить запись в файл журнала.

Заранее спасибо за помощь.

Ответы [ 2 ]

19 голосов
/ 18 ноября 2010

Вы можете получить идентификатор процесса (PID) по названию, используя команду pgrep, например:

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.

Надеюсь, это поможет

2 голосов
/ 18 ноября 2010

Если вы знаете, как это сделать в терминале, то вы можете использовать следующее:

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

Так что в итоге у вас будет что-то вроде скрипта мини-оболочки внутри python. Я также хотел бы рассмотреть возможность создания этого сценария оболочки, а затем вызвать его из python:

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

Ура!

...