我怎么能知道我的python脚本运行? (使用Cygwin或Windows外壳)(How can

2019-10-19 15:15发布

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

Answer 1:

这是该平台的限制。

你可能需要使用一些低级别的API来检索进程信息。 您可以在这一个看看: 获取另一个进程的命令行参数在Windows

你也许可以使用WIN32API模块来访问这些API。

(对不起,从Windows PC离开,所以我不能尝试一下)



Answer 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
$

因此,看来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)