当前位置: 首页 > 面试题库 >

在关闭信号上在python脚本中运行代码

龙学
2023-03-14
问题内容

我有一个在启动时在后台运行的python脚本。启动方法是run.sh文件中的一个条目,该文件由/etc/rc.local调用。确切的输入将是“ sudo
python /home/pi/run/main.py&”。该系统是带有微调的树莓派。

该脚本正在运行,到目前为止没有问题。如果将关闭命令发送到系统(通过控制台“ sudo shutdown -h
now”),我还需要该脚本不要立即终止,而是先执行一些代码。那就是我到目前为止所得到的:

#!/usr/bin/env python

import atexit

@atexit.register
def byebye():
    c = "End"
    datei = open("/home/pi/logfile",'a+b')
    datei.write(c + "\n")
    datei.close()

def main():

   while True:
     ...do anything...

main()

现在,它似乎仅在关闭时退出主循环。我是否需要使用其他方法关闭系统,以便将信号传输到我的脚本,或者我可能无法使用“ @atexit”方法?有任何想法吗?

谢谢


问题答案:

shutdown发送不处理的SIGTERM信号atexit。上下文管理器,finally块等也不会。

import signal

signal.getsignal(signal.SIGTERM)
Out[64]: 0 #i.e. nothing

与此相反,例如ctrl-C:

signal.getsignal(signal.SIGINT)
Out[65]: <function signal.default_int_handler> #i.e. something

您可以向其注册byebye函数signal以运行而不是不执行任何操作(这将导致解释器最终被shell杀死)

signal.signal(signal.SIGTERM,byebye)

如果执行上述操作,则需要做两件事:

  • 更改的签名byebye以接受signal将传递给它的两个参数。
  • 您应该sys.exit()byebye函数末尾执行类似call的操作,以允许python正常关闭商店。

您也可以将signal 进行某种组合atexit

import sys
signal.signal(signal.SIGTERM, lambda num, frame: sys.exit(0))

它将直接插入您当前的代码。这样可以确保清理操作的原子性(即byebye保证是最后的I / O操作),但会有些笨拙。



 类似资料:
  • 我想执行我开发的三个python脚本。我发现了一个疑问,我怎么能使用python脚本呢? 我想把它转换成一个。因为我们的解决方案被认为是在没有安装python的机器上执行的,所以有一个独特的脚本会很有帮助。 编辑:我不知道我的老问题结束的原因,我知道如何使用pyinstaller,我的问题是如何使用python脚本执行3 python,或者如果可能的话。请,如果你要结束一个问题,请确保该问题是重复

  • 问题内容: 我有一个 包含特定日期和时间 的 文本文件。 我希望能够 在该文件中指定的时间运行脚本。 您将如何实现?创建另一个在后台运行的脚本(有点像守护进程),并每秒检查当前时间是否与文件中的时间匹配?还有另一种方法吗?该机是 linux服务器,Debian wheezy。提前致谢 问题答案: 请看以下内容: 该代码行在特定时间执行“ ls -l”。这是在特定时间执行某些操作(在我的示例中为命令

  • 我正在尝试开始python web编程,但我有一个问题。我想与CGI合作,我在pc(Linux)上安装了Ampps web服务器。根据本说明,Apache教程:使用CGI的动态内容。我把我的文件索引。pl位于文件夹“/usr/local/ampps/www/cgi-bin”中,并尝试访问它 以下是我的文件代码: 但这给了我一个错误对不起,你正在寻找的页面目前不可用。 这是Apache的错误日志:

  • 问题内容: 我有一个在Linux上运行的Python(3)脚本,称为主脚本,该脚本必须从专有DLL调用例程。到目前为止,我已经使用Wine使用以下结构解决了这个问题: 脚本 dll_call.py 由Wine下安装的Windows Python(3)解释器执行。它将返回值转储到一个文件中,然后由等待的主脚本拾取该文件。如果我必须连续执行几次,它不是完全可靠且令人痛苦的缓慢。 我想一次启动脚本 dl

  • 问题内容: 我想编写一个python脚本,它将上载我在Windows资源管理器中选择的任何文件。这个想法是在Windows资源管理器中选择任何文件,右键单击以显示文件的上下文菜单,然后从中选择一个命令,例如“上传到Web服务器”。 选择命令后,Python运行脚本来接收文件路径和要上传的文件的文件名。编写将文件上传到Web的Python脚本似乎很简单。还不清楚如何在Windows上下文菜单中为Py

  • 问题内容: 我有一个脚本,可以创建网站并动态打印一些数据。-打印的数据应来自另一个python脚本。 我目前面临的问题是,如果我将执行python脚本的行放在执行应用程序的行之前,它将运行Python脚本而不运行;反之亦然。 Python脚本: Flask脚本(注意:价格应为其他脚本的“解析”变量): 问题答案: 使用: 将python脚本(例如)生成的内容包装到函数中。 将其放置在与或相同的目录

  • 问题内容: 我不知道应该把我的Spider代码放在哪里以及如何从main函数中调用它。请帮忙。这是示例代码: 问题答案: 所有其他答案均参考Scrapyv0.x。根据更新的文档,Scrapy 1.0要求:

  • 这是我第一次在java中尝试python。我试图从我的代码中执行python脚本,如下所示。 但我有以下例外 无法运行程序“python”:CreateProcess error=2,系统找不到指定的文件 我已经安装了python。我不确定为什么找不到该文件。我试着跟随这个链接,但它并没有解决我的问题。 提前谢谢。 编辑1 我尝试了“Viacheslav Vedenin”给出的示例代码,当我执行我