我想每隔几分钟运行一个命令,直到我将其关闭。
经过一番搜索,我发现了很多方法可以完成前半部分(定期和无限期地运行命令),那么我想将其关闭怎么办?
编辑
“关闭它”可能是指“使用另一个 shell 命令将其关闭”。
编辑
只是为了澄清我真正想做的事情,实际上我想P
定期运行一个Python程序,直到我给出一些命令来停止它。
以防万一P
在我发出停止命令时它正在运行,我希望它首先完成当前的运行,然后从此不再运行。
答案1
您有两个选择:修改 Python 脚本,或编写 shell 脚本包装器。
修改Python脚本:
你应该围绕你想做的事情进行循环。
安装信号处理程序以捕获
INT
信号(由Ctrl-发送C)和TERM
信号(由 plain 发送kill
)。捕获到信号后,设置一个变量,告诉 Python 脚本不应再循环。我对 Python 不太熟悉,无法告诉你如何做到这一点。
替代解决方案:Shell 脚本包装器,其功能与上面相同,但在 Python 脚本之外:
#!/bin/sh
loop_again=1
trap 'loop_again=0;wait' INT TERM
while (( loop_again )); do
echo "Kill me with 'kill -9 $$'"
./python_script &
echo "Kill the Python script with 'kill $!'"
wait
done
此包装器脚本在后台启动您的 Python 脚本,然后等待它完成。然后它会无限期地重新启动。它还告诉您如何在每次迭代中终止它和 Python 脚本。
如果你的kill
脚本(使用简单的kill
,不是 kill -9
),或按Ctrl- C,loop_again
变量设置为零(这将导致循环在当前迭代结束时终止),然后等待当前正在运行的后台进程完成后再退出。
如果您使用 终止包装器脚本kill -9
(这与 相同kill -s KILL
,发送一个KILL
无法被忽略或被信号处理程序捕获的信号),它将退出,而您的 Python 脚本将在后台运行,直到它自行完成。
答案2
您可以尝试使用watch
“循环”重复运行程序并查看结果,或者使用while
循环。获取该进程的 PID,echo $!
并使用它kill
来终止该 PID。例如 :
while :; do ./test.py; done & echo $! > /tmp/testpy.pid
当你需要时使用kill来终止程序:
kill -9 `cat /tmp/testpy.pid`
答案3
您可以创建一个 cron 作业来定期运行您的命令。例如,如果您想每小时执行一次作业,您应该创建以下 cron 作业:
0 * * * * /path/to/your/command >/dev/null 2>&1
如果你想停止作业类型的执行ps aufx|grep yourcommand|grep -v
并杀死它的pid。
答案4
您可以按CTRL+或使用或c发送 SIGTERM 信号。kill
killall