我有一个名为Python脚本sudoserver.py
我做的cygwin外壳开始:
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外壳 :
C:\>tasklist | find "python" /i
python2.7.exe 4344 Console 1 13.172 KB
因此,似乎我对任何信息.py
正在执行的文件。 我所知道的是,蟒蛇正在运行的东西 。
该-l
(长)选项“PS”在Cygwin没有找到我.py
文件。 也不它的/v
(详细)开关在tasklist
。
应该用什么合适的壳(Windows或cygwin外壳会不够;如果双方可能将被罚款)如果一个特定的Python脚本现在执行以编程方式找到?
注:Python进程可以由其他用户启动。 即使从在GUI外壳没有登录用户,并,甚至更多,“系统”(特权)的Windows用户。
这是该平台的限制。
你可能需要使用一些低级别的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
...然后当我已经关闭了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
$
因此,看来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
正在运行,但成功删除时锁定的文件testlock.py
已停止使用Ctrl-C
。
注意,这种方法在Windows工作,但它不会在Unix的工作,因为,根据Python文档 :
在Windows上,试图删除的文件正在使用中会导致抛出一个异常; 在Unix上,目录项被删除,但直到原来的文件不再使用分配给文件存储不是可用。
使用附加的Python模块与平台无关的溶液的FileLock中描述锁定在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
已经运行完毕。
文章来源: How can I know if my python script is running? (using Cygwin or Windows shell)