我有一个名为sudoserver.py
的python脚本,我在 CygWin shell中开始执行以下操作:
python sudoserver.py
我打算创建一个shell脚本(我还不知道,如果我将使用Windows shell脚本或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正在运行某些东西
' ps'的-l
(长)选项在CygWin上找不到我的.py
文件。 /v
处的tasklist
(详细)切换也不是。{。}
什么应该是适当的shell(Windows或CygWin shell就足够了;两者如果可能的话会很好)以编程方式查找特定python脚本是否正在执行的方式?
注意:python进程可以由另一个用户启动。即使是未登录GUI shell的用户,甚至是" SYSTEM" (特权)Windows用户。
答案 0 :(得分:2)
这是平台的限制。
您可能需要使用一些低级API来检索进程信息。你可以看一下这个:Getting the command line arguments of another process in Windows
您可以使用win32api模块访问这些API。
(抱歉,远离Windows PC,所以我无法尝试)
答案 1 :(得分:2)
由于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
...然后我使用testlock.py
关闭了Ctrl-C
:
Simon@Simon-PC ~/test/python
$ rm lockfile.lck
Simon@Simon-PC ~/test/python
$ ls
testlock.py
Simon@Simon-PC ~/test/python
$
因此,在testlock.py
脚本运行时,Windows似乎锁定了该文件,但在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
正在运行时,但在使用testlock.py
停止Ctrl-C
时成功删除了锁定的文件。
请注意,此方法适用于Windows但在Unix中无法工作,因为根据Python documentation:
在Windows上,尝试删除正在使用的文件会导致 提出的例外;在Unix上,目录条目被删除 但是分配给该文件的存储直到可用 原始文件已不再使用。
FileLock中描述了使用其他Python模块Locking a file in Python的独立于平台的解决方案。
(进一步编辑)
看起来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
已经完成运行。