[英]How can I know if my python script is running? (using Cygwin or Windows shell)
我有一个名为sudoserver.py
的python脚本,该脚本通过以下操作在CygWin shell中启动:
python sudoserver.py
我打算创建一个外壳脚本(我尚不知道是否要使用Windows外壳脚本或CygWin脚本),该脚本需要知道此sudoserver.py
python脚本是否正在运行。 但是,如果我在CygWin中这样做(当sudoserver.py
运行时):
$ ps -e | grep "python" -i
11020 10112 11020 7160 cons0 1000 00:09:53 /usr/bin/python2.7
在Windows shell中 :
C:\>tasklist | find "python" /i
python2.7.exe 4344 Console 1 13.172 KB
因此,似乎我没有有关正在执行的.py
文件的信息。 我所知道的是python正在运行某些东西 。
CygWin上'ps'的-l
(long)选项找不到我的.py
文件。 在tasklist
的/v
(详细)开关也不是。
以什么方式合适地以编程方式查找特定的python脚本是否正在执行(Windows或CygWin shell;如果可能的话,两者都可以)。
注意:python进程可能由另一个用户启动。 甚至来自未登录GUI Shell的用户,甚至还有未登录Windows的“ SYSTEM” (特权)用户。
这是平台的局限性。
您可能需要使用一些低级API来检索流程信息。 您可以看一下以下内容: 在Windows中获取另一个进程的命令行参数
您可能可以使用win32api模块来访问这些API。
(抱歉,远离Windows PC,所以我无法尝试)
由于sudoserver.py
是您的脚本,因此可以对其进行修改以在启动时在可访问的位置创建文件,并在完成时删除该文件。 然后,您的Shell脚本可以检查该文件是否存在,以查找sudoserver.py
是否正在运行。
(编辑)
感谢评论者的建议,尽管文件的存在与否是不可靠的指示器,但文件的锁定状态不是。
我编写了以下Python脚本testlock.py
:
f = open ("lockfile.lck","w")
for i in range(10000000):
print (i)
f.close()
...并在Windows PC上的Cygwin控制台窗口中运行它。 同时,我在同一目录中打开了另一个Cygwin控制台窗口。
首先,在我启动testlock.py
:
Simon@Simon-PC ~/test/python
$ ls
lockfile.lck testlock.py
Simon@Simon-PC ~/test/python
$ rm lockfile.lck
rm: cannot remove `lockfile.lck': Device or resource busy
...然后在我使用Ctrl-C
关闭testlock.py
之后:
Simon@Simon-PC ~/test/python
$ rm lockfile.lck
Simon@Simon-PC ~/test/python
$ ls
testlock.py
Simon@Simon-PC ~/test/python
$
因此,似乎Windows在testlock.py
脚本运行时正在锁定文件,但是在使用Ctrl-C
停止时将其解锁。 可以使用以下脚本在Python中执行等效测试:
import os
try:
os.remove ("lockfile.lck")
except:
print ("lockfile.lck in use")
...正确报告:
$ python testaccess.py
lockfile.lck in use
...当testlock.py
运行时,但是当用Ctrl-C
停止testlock.py
时成功删除了锁定的文件。
请注意,这种方法在Windows中有效,但在Unix中不起作用,因为根据Python文档 :
在Windows上,尝试删除正在使用的文件会引发异常。 在Unix上,目录条目已删除,但分配给文件的存储空间不再可用,直到不再使用原始文件为止。
在Python中锁定文件中描述了使用附加的Python模块FileLock的与平台无关的解决方案。
(进一步编辑)
看来,OP不一定需要Python解决方案。 一种替代方法是使用bash
进行此操作。 这是testlock.sh
:
#!/bin/bash
flock lockfile.lck sequence.sh
脚本sequence.sh
仅运行耗时的操作:
#!/bin/bash
for i in `seq 1 1000000`;
do
echo $i
done
现在,当testlock.sh
运行时,我们可以使用flock
上的另一个变体来测试锁定状态:
$ flock -n lockfile.lck echo "Lock acquired" || echo "Could not acquire lock"
Could not acquire lock
$ flock -n lockfile.lck echo "Lock acquired" || echo "Could not acquire lock"
Could not acquire lock
$ flock -n lockfile.lck echo "Lock acquired" || echo "Could not acquire lock"
Lock acquired
$
前两次尝试锁定文件的尝试均失败,因为testlock.sh
仍在运行,因此文件已被锁定。 上一次尝试成功,因为testlock.sh
已完成运行。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.