Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/extjs/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
要求python从bash(/tmp/stop?)停止(控制)的有效方法_Python_Bash_Ipc_Kill Process - Fatal编程技术网

要求python从bash(/tmp/stop?)停止(控制)的有效方法

要求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脚本请求Python程序停止(以受控方式)最有效的方法是什么。在python方面,我需要一个函数(执行速度尽可能快),它在请求停止时返回true,否则返回false。如果为真,则保存工作,释放资源并退出

对于一些简单的工具,我实现了以下功能:

  • 在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是否会等待该时间?那么我就不需要在我的