Как мне запланировать завершение процесса? - PullRequest
0 голосов
/ 01 апреля 2009

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

Ответы [ 7 ]

3 голосов
/ 01 апреля 2009

с bash:

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

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

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

3 голосов
/ 01 апреля 2009

Это на 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)
2 голосов
/ 01 апреля 2009

В питоне:

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() является питоном> = 2,6.

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

os.kill(p.pid, signal.SIGTERM)
0 голосов
/ 03 апреля 2009

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

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

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

0 голосов
/ 01 апреля 2009

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

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

Убить процессы с известным ID

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

0 голосов
/ 01 апреля 2009

Посмотрите на утилиту start-stop-daemon .

0 голосов
/ 01 апреля 2009

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

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

...