2015-03-30 142 views
2

我想知道如何停止当前的python脚本,当它已经运行。如何在另一个python脚本运行时停止我的python脚本?

要清楚,我想写在我自己的Python脚本中。所以首先,在main方法中,它会检查我的python脚本是否已经运行。如果它正在运行,我想退出并显示一条错误消息。

目前我尝试这种代码:

if os.system("ps ax | grep sample_python.py") == True: 
    print "fail" 
    exit(0) 
else: 
    print "pass" 

上面的代码看起来是grepping蟒蛇名字..但它总是去别的循环,而不是进入的,如果循环和退出..

所以出于测试目的,我运行我的脚本,并在另一个终端上再次运行我的脚本。第一个脚本不会停止,但第二个python不会进入if循环来打印出错误消息。

我该如何解决这个问题?


好吧,我发现了一个愚蠢的事情,我想看看是否有人能帮助我出去转转吧.. 所以我的观点是杀,如果另一个Python当前正在运行,这只是开始蟒蛇.. 但愚蠢的事情是..因为我正在运行我的Python和运行一个检查编码这个蟒蛇里面..它将永远退出..因为只要我启动Python的PID将被创建并将运行...

所以.. python开始 - > PID创建并运行 - >检查如果Python正在运行 - >是的Python正在运行 - >退出。

我想看看是否有办法做 python starts - >检查python是否已经在运行 - >如果它正在运行kill kill当前的python不是正在运行的python。

+1

如果找不到匹配,grep会发现自己 – 2015-03-30 19:58:47

+0

诊断问题的方法是首先在脚本运行时以及何时不检查是否有命令行输入'ps ax ...'正确的命令行。然后你编写一个python脚本,它只是打印出'os.system(...'调用的结果,再次检查是否有差异,然后你就可以编写你需要的脚本了。 – quamrana 2015-03-30 20:03:18

+0

你可以使用'pgrep'和'pkill'来查找并终止进程,而不包括grep进程本身(也有各种shell实用程序可以确保只有一个副本运行,尽管它们可能不适合您的情况) – DNA 2015-03-30 20:26:33

回答

7

带有正在运行的进程的PID的锁定文件是一个更系统的方式如何做到这一点。程序仅在开始时检查PID文件是否存在并被锁定(flocklockf);如果是这样,这意味着该程序的另一个实例仍在运行。如果不是,它会创建(或重写)PID文件并将其锁定。

flock/lockf锁具有操作系统在程序终止的情况下自动移除锁定的优点。

在这里看到如何在Python中做到这一点:

Python: module for creating PID-based lockfile?

+0

仅供参考,自接受答案中链接的脚本自答案编写以来已更新,并且对Mercurial软件包的依赖性比原来要高。尽管这可能不是OP的问题。 – detly 2015-03-30 20:31:05

+0

是的 - PID是这个的标准。另见http://stackoverflow.com/questions/688343/reference-for-proper-handling-of-pid-file-on-unix – Jonathan 2015-03-30 20:32:47

0

os.system()返回运行命令的退出值。如果ps成功,则返回0,这不等于True。你可以明确地测试这个命令是否返回零,这会让你进入if块。

编辑:为此需要os.subprocess。这四个命令应该得到你想要的。

p1 = subprocess.Popen(['ps', 'ax'], stdout=subprocess.PIPE) 
p2 = subprocess.Popen(['grep', 'bash'], stdin=p1.stdout, stdout=subprocess.PIPE) 
p3 = subprocess.Popen(['wc', '-l'], stdin=p2.stdout, stdout=subprocess.PIPE) 
count = int(p3.stdout.read()) 
if count > 1: 
    print('yes') 

将“bash”替换为脚本的名称。它的作用是获取正在运行的进程的列表,输出到grep的管道将除了脚本(或代码示例中的bash实例),输出到wc以获取行数的管道,然后请求该进程它的stdout是当前正在运行的脚本实例的计数。然后,您可以在if语句中使用该计数变量,如果有多个实例在运行,则可以中止运行。

+0

谢谢但我现在遇到了一个问题..当我运行我的编码'if os.system(“ps ax | grep sample_python.py”)'..它总是打印'5440 pts/0 S + 0:00 sh -c ps ax | grep sample_python.py'和'5442 pts/0 S + 0:00 grep sample_python.py'并且现在退出......即使我的python没有运行或者刚刚启动.. ' – Tim 2015-03-30 20:03:00

+0

如果两个脚本都具有相同的名称,听起来像,那么ps/grep将总是返回至少一行,所以你可以运行输出通过wc查看是否有两行或更多行。另一种方法是创建一个在脚本运行结束时被删除的锁定文件 - 然后您可以测试它是否存在,以及是否创建它并运行脚本。 – devinformatics 2015-03-30 20:07:04

+0

我不明白..你能解释一点吗? – Tim 2015-03-30 20:08:33

0

更多Python的方式:

import os 
import psutil 

script_name = os.path.basename(__file__) 
if script_name in [p.name() for p in psutil.get_process_list()]: 
    print "Running" 
-1

因为使用os.system( “ps的斧头| grep的sample_python.py”)返回0 。 这不是真的。

看这个问题: Assign output of os.system to a variable and prevent it from being displayed on the screen

您必须编写

os.popen('cat /etc/services').read() 

但这种方式,你会经常去“失败”,因为你的脚本已经开始。你将必须在这里计算返回的行数...

看成单一实例的变体:

Python: single instance of program

我写了这样的剧本。我在开始时创建了任何名称的文件,并在最后删除。这是守护进程脚本。开始时我检查了是否存在该文件。

不坏的变体是这里Ensure a single instance of an application in Linux

import fcntl 
pid_file = 'program.pid' 
fp = open(pid_file, 'w') 
try: 
    fcntl.lockf(fp, fcntl.LOCK_EX | fcntl.LOCK_NB) 
except IOError: 
    # another instance is running 
    sys.exit(1) 
0

而不是使用grep,为什么不创建一个锁定文件?程序的一个实例会在已知位置创建一个文件,并在退出时删除它。任何其他实例都必须检查该文件是否存在,并且只应在该文件已存在时继续运行。

os.open()功能有特定的标志为这个:

import os 

LOCKFILE_LOCATION = "/path/to/lockfile" 

try: 
    os.open(LOCKFILE_LOCATION, os.O_CREAT|os.O_WRONLY|os.O_EXCL) 
    # Maybe even write the script's PID to this file, just in case you need 
    # to check whether the program died unexpectedly. 
except OSError: 
    # File exists or could not be created. Can check errno if you really 
    # need to know, but this may be OS dependent. 
    print("Failed to create lockfile. Is another instance already running?") 
    exit(1) 
else: 
    print("Pass") 
    # Run the rest of the program. 
    # Delete the file 
    os.remove(LOCKFILE_LOCATION) 

尝试了这一点通过把,比如说,后打印`(“通行证”),并运行此脚本的多个实例;除了一个都会失败。

相关问题