我在linux上使用Python 2.6。
我有一个run.py脚本,它在后台启动多个服务并生成kill.py以终止这些进程。
在kill.py中,当它完成它的工作时取消链接是否安全?
import os
# kill services
os.unlink(__file__)
# is it safe to do something here?
我是Python的新手。我担心的是,由于Python是一种脚本语言,整个脚本可能不在内存中。在取消关联之后,将无法解释其他代码。
我尝试过这个小测试。
import os
import time
time.sleep(10) # sleep 1
os.unlink(__file__)
time.sleep(10) # sleep 2
我在运行此文件时运行stat kill.py
且链接数始终为1,所以我猜Python解释器没有链接到该文件。
作为一个更高层次的问题,创建一个稍后要被杀死的进程列表的常用方法是什么?
答案 0 :(得分:2)
如果你可以避免脚本,就不要让你的脚本编写新脚本 - 只需写出一个PID列表,然后通过它们。 它并不是很清楚你想要做什么,但创建和删除脚本听起来就像是一个太脆弱的魔法。
回答这个问题:
,Python会编译所有源并在执行前关闭文件,因此这是安全的。通常,在Linux上取消链接打开的文件是安全的。 (但不是无处不在:在Windows上,您无法删除正在使用的文件。)
请注意,当您import
模块时,Python 2会将其编译为.pyc
字节码文件并对其进行解释。如果删除.py
文件,Python仍将使用.pyc
,反之亦然。
答案 1 :(得分:1)
请勿拨打reload!
Python不需要对文件进行锁定,因为它们是在导入时编译和加载的。实际上,在程序运行时交换文件的能力通常非常有用。
答案 2 :(得分:1)
IIRC(!):当在* nix上时,unlink仅删除文件系统中的名称,当最后一个文件句柄关闭时,将删除inode。因此,除了python尝试重新打开文件之外,这不会引起任何问题。
答案 3 :(得分:1)
作为一个更高层次的问题,创建一个稍后要被杀死的进程列表的常用方法是什么?
我会将PID放在list
中并使用os.kill
进行迭代。我不明白为什么要为此创建和执行新脚本。
答案 4 :(得分:0)
Python读取整个源文件并在执行之前编译它,因此您不必担心删除或更改正在运行的脚本文件。