繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM