Как мне запланировать завершение процесса?

Мне нужно запустить процесс, подождать несколько часов, убить его и запустить его снова. Есть ли простой способ, которым я могу выполнить это с помощью Python или Bash? Я могу запустить его в фоновом режиме, но как я могу определить, как использовать его?

7 Solutions collect form web for “Как мне запланировать завершение процесса?”

С bash:

while true ; do run_proc & PID=$! sleep 3600 kill $PID sleep 30 done 

$! переменная bash расширяется до PID самого недавно начатого фонового процесса. sleep просто ждет час, а затем kill этот процесс.

Цикл while просто продолжает делать это снова и снова.

Это в Perl, но вы должны иметь возможность перевести его на Python.

 #!/usr/bin/perl use strict; use warnings; #set times to 0 for infinite times my ($times, $wait, $program, @args) = @ARGV; $times = -1 unless $times; while ($times--) { $times = -1 if $times < 0; #catch -2 and turn it back into -1 die "could not fork" unless defined(my $pid = fork); #replace child with the program we want to launch unless ($pid) { exec $program, @args; } #parent waits and kills the child if it isn't done yet sleep $wait; kill $pid; waitpid $pid, 0; #clean up child } 

Потому что я пытаюсь научить себя Python, вот он в Python (я не доверяю этому коду):

 #!/usr/bin/python import os import sys import time times = int(sys.argv[1]) wait = int(sys.argv[2]) program = sys.argv[3] args = [] if len(sys.argv) >= 4: args = sys.argv[3:] if times == 0: times = -1 while times: times = times - 1 if times < 0: times = -1 pid = os.fork() if not pid: os.execvp(program, args) time.sleep(wait) os.kill(pid, 15) os.waitpid(pid, 0) 

В python:

 import subprocess import time while True: p = subprocess.Popen(['/path/to/program', 'param1', 'param2']) time.sleep(2 * 60 * 60) # wait time in seconds - 2 hours p.kill() 

p.kill() – это python> = 2.6.

На python <= 2.5 вы можете использовать это вместо:

 os.kill(p.pid, signal.SIGTERM) 

Вы всегда можете написать сценарий для поиска этих процессов и убить их, если они будут найдены. Затем добавьте cronjob для выполнения скрипта.

Найти идентификатор процесса процесса с известным именем

Убить процессы с известным идентификатором

В python os.kill () можно использовать для уничтожения процесса с учетом идентификатора.

Взгляните на утилиту start-stop-daemon .

Одна идея: сохранить PID процесса (возвращенный fork() в дочернем процессе) в файл, либо либо запланировать задание cron чтобы убить его, либо убить его вручную, читая PID из файла.

Другой вариант: создать оболочку оболочки оболочки, которая автоматически убивает и перезапускает процесс. То же, что и выше, но вы можете хранить PID в памяти, спать столько, сколько вам нужно, убить процесс, а затем цикл.

Не идеальный метод, но если вы знаете имя программы, и знаете, что это единственный процесс, выполняемый в системе, вы можете использовать это в cron:

 0 */2 * * * kill `ps -ax | grep programName | grep -v grep | awk '{ print $1 }'` && ./scriptToStartProcess 

Это будет работать каждые два часа в час и убить имя_программы, а затем снова запустить процесс.

Python - лучший язык программирования в мире.