我需要运行一个进程,等待几个小时,杀死它,然后重新启动它。有没有一种简单的方法可以用Python或Bash实现这一点?我可以在后台运行它但是如何识别它以使用kill呢?
答案 0 :(得分:3)
这是在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)
答案 1 :(得分:3)
使用bash:
while true ; do
run_proc &
PID=$!
sleep 3600
kill $PID
sleep 30
done
$!
bash变量扩展为最近启动的后台进程的PID。 sleep
等待一个小时,然后kill
关闭该过程。
while
循环只是一遍又一遍地进行。
答案 2 :(得分:2)
在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&gt; = 2.6。
在python&lt; = 2.5上,你可以改用:
os.kill(p.pid, signal.SIGTERM)
答案 3 :(得分:0)
一个想法:将进程的PID(由子进程中的fork()
返回)保存到文件中,然后安排cron
作业将其终止或手动终止,从中读取PID文件。
另一个选项:创建一个自动终止并重启进程的shell脚本包装器。与上面相同,但您可以将PID保留在内存中,根据需要休眠,终止进程,然后循环。
答案 4 :(得分:0)
查看start-stop-daemon实用程序。
答案 5 :(得分:0)
您总是可以编写脚本来搜索这些进程并在找到时将其终止。 然后添加一个cronjob来执行脚本。
Find process ID of a process with known name
Kill processes with a known ID
在python os.kill()中可以用来杀死给定id的进程。
答案 6 :(得分:0)
不是一种理想的方法,但如果你知道程序的名称,并且你知道它是系统上运行该名称的唯一过程,你可以在cron中使用它:
0 */2 * * * kill `ps -ax | grep programName | grep -v grep | awk '{ print $1 }'` && ./scriptToStartProcess
这将在每小时每两小时运行并杀死programName,然后再次启动该过程。