要求python从bash(/tmp/stop?)停止(控制)的有效方法
在轮询开销方面,从Bash脚本请求Python程序停止(以受控方式)最有效的方法是什么。在python方面,我需要一个函数(执行速度尽可能快),它在请求停止时返回true,否则返回false。如果为真,则保存工作,释放资源并退出 对于一些简单的工具,我实现了以下功能:要求python从bash(/tmp/stop?)停止(控制)的有效方法,python,bash,ipc,kill-process,Python,Bash,Ipc,Kill Process,在轮询开销方面,从Bash脚本请求Python程序停止(以受控方式)最有效的方法是什么。在python方面,我需要一个函数(执行速度尽可能快),它在请求停止时返回true,否则返回false。如果为真,则保存工作,释放资源并退出 对于一些简单的工具,我实现了以下功能: 在bash中,我执行了一个touch/tmp/stop 我的Python程序确实存在频繁轮询/tmp/stop。如果存在,则以受控方式退出 我的bash脚本等待(loop-sleep-ps),直到相关进程停止 此解决方案可行,
- 在bash中,我执行了一个
touch/tmp/stop
- 我的Python程序确实存在频繁轮询
。如果存在,则以受控方式退出李>/tmp/stop
- 我的bash脚本等待(loop-sleep-ps),直到相关进程停止
是否有其他开销较小的选项(就Python轮询时间而言) UNIX信号机制将是一个很好的选择。您不需要任何临时文件,轮询开销基本上为零 您可以像这样优雅地关闭以下python程序:
kill-USR1$pid
import signal
import time
import sys
please_stop = False
def setup_signal():
def handler(x,y):
global please_stop
please_stop = True
signal.signal(signal.SIGUSR1, handler)
def main_task():
for i in range(10):
print "Working hard on iteration #%d"%i
time.sleep(1)
if please_stop:
print "Stopping now"
sys.exit(0)
setup_signal()
main_task()
UNIX信号机制将是一个很好的选择。您不需要任何临时文件,轮询开销基本上为零 您可以像这样优雅地关闭以下python程序:
kill-USR1$pid
import signal
import time
import sys
please_stop = False
def setup_signal():
def handler(x,y):
global please_stop
please_stop = True
signal.signal(signal.SIGUSR1, handler)
def main_task():
for i in range(10):
print "Working hard on iteration #%d"%i
time.sleep(1)
if please_stop:
print "Stopping now"
sys.exit(0)
setup_signal()
main_task()
您可以向python进程发送一个中断信号(SIGINT)。这与按下Ctrl+C键时shell将发送的信号相同: 在Bash中看起来像这样:
python my_script.py在后台启动脚本
pyscript_pid=$!#存储python解释器的PID
睡眠(5)#暂停5秒
kill-s SIGINT$pyscript#u pid#向进程发送SIGINT信号
在Python中,您只需捕获解释器接收到SIGINT信号时抛出的键盘中断
异常:
试试看:
打印(“我还在跑步…”)
#做一些有用的事情,但它必须在任何时候都可以被打断!
除键盘中断外:
打印(“我现在要退出。”)
#整理一下。。。
# ... 退出
但是,您不应该执行在try块中途中断时会中断任何内容的操作,而应该只执行可以中断或重置为整理代码中最后一个有效状态的操作。或者,您可以使用try:。。。最后:…
以确保finally
块中的代码始终启动,即使try
中的代码在运行时被中断
您也可以查看或@Robᵩ'让我们来看看如何捕获所有可能的信号,不仅仅是SIGINT,以及如何为它们注册事件处理程序,而不是使用try-catch(-finally),这将是最简单的方法。您可以向python进程发送中断信号(SIGINT)。这与按下Ctrl+C键时shell将发送的信号相同: 在Bash中看起来像这样:
python my_script.py在后台启动脚本
pyscript_pid=$!#存储python解释器的PID
睡眠(5)#暂停5秒
kill-s SIGINT$pyscript#u pid#向进程发送SIGINT信号
在Python中,您只需捕获解释器接收到SIGINT信号时抛出的键盘中断
异常:
试试看:
打印(“我还在跑步…”)
#做一些有用的事情,但它必须在任何时候都可以被打断!
除键盘中断外:
打印(“我现在要退出。”)
#整理一下。。。
# ... 退出
但是,您不应该执行在try块中途中断时会中断任何内容的操作,而应该只执行可以中断或重置为整理代码中最后一个有效状态的操作。或者,您可以使用try:。。。最后:…
以确保finally
块中的代码始终启动,即使try
中的代码在运行时被中断
您也可以查看或@Robᵩ'让我们来看看如何捕获所有可能的信号,不仅仅是SIGINT,以及如何为它们注册事件处理程序,而不是使用try catch(-finally),这将是最简单的方法。使用信号处理程序是最好的选择。其他选项包括使用辅助线程(等待命名管道上的某些数据)或创建一个套接字(由bash进程访问)。使用信号处理程序是最好的选择。其他选项包括使用辅助线程(等待命名管道上的某些数据)或创建一个套接字(由bash进程访问)。我避免了异常,因为OP特别要求提供轮询解决方案。感谢您的回答,但我更喜欢Robs答案。异常会中断我的正常流程,而轮询不会。我避免了异常,因为OP特别要求提供轮询解决方案。感谢您的回答,但我更喜欢Robs的答案。异常会中断我的正常流程,而轮询不会。顶部,这就是我要查找的。另外一个问题:KILL是否会等待进程结束?。例如,假设我启动一个需要5-10秒或20秒的保存操作,kill是否会等待该时间?然后我就不需要在我的bash中轮询了。我很确定它不会等待,因为例如,并不是所有的信号都被定义为导致程序终止,而是检查它的主页:
mankill
kill
是bash中内置的shell(使用类型kill
进行检查),所以mankill
可能不合适,help kill
可以在bash中使用。另请参见man2sigaction
和Linux上的man7signal
。顶部,这就是我要查找的。另外一个问题:KILL是否等待进程结束?。例如,假设我启动一个需要5-10秒或20秒的保存操作,kill是否会等待该时间?那么我就不需要在我的