我怎么知道我的python脚本是否正在运行? (使用Cygwin或Windows shell)

时间:2014-03-21 23:32:03

标签: python shell cygwin

我有一个名为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用户。

2 个答案:

答案 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已经完成运行。