当另一个python脚本正在运行时,如何停止python脚本?

当另一个python脚本正在运行时,如何停止python脚本?,python,linux,unix,Python,Linux,Unix,我想知道如何在当前python脚本已经运行时停止它 为了清楚起见,我想用我自己的python脚本编写它。所以第一件事,在main方法中,它将检查我的python脚本是否已经在运行。如果它正在运行,我想退出并显示一条错误消息 目前我正在尝试以下代码: if os.system("ps ax | grep sample_python.py") == True: print "fail" exit(0) else: print "pass" 上面的代码看起来像是将pyt

我想知道如何在当前python脚本已经运行时停止它

为了清楚起见,我想用我自己的python脚本编写它。所以第一件事,在main方法中,它将检查我的python脚本是否已经在运行。如果它正在运行,我想退出并显示一条错误消息

目前我正在尝试以下代码:

if os.system("ps ax | grep sample_python.py") == True:
     print "fail"
     exit(0)
else:
     print "pass"
上面的代码看起来像是将python名称变灰。。但它总是转到else循环,而不是进入if循环并退出

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

我怎样才能解决这个问题


好吧,我发现了一个愚蠢的东西,我想看看是否有人能帮我绕过它。。 因此,我的观点是,如果另一条python正在运行,则杀死刚刚启动的python。。 但最愚蠢的是。。因为我正在运行我的python,并在python内部运行检查代码。。它将永远退出。。因为我一启动python PID就会创建并运行

所以。。python启动->创建并运行pid->检查python是否正在运行->是python正在运行->退出

我想看看有没有办法 python启动->检查python是否已经运行->如果它正在运行,杀死当前的python而不是正在运行的python

返回已运行命令的退出值。如果ps成功,则返回0,这不等于True。您可以显式地测试命令是否返回零,这将使您进入if块

编辑:要做到这一点需要。这四个命令应该得到您想要的

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语句中使用该count变量,如果有多个实例正在运行,则可以中止运行。

一个带有运行进程PID的锁文件是一种更系统的方法。程序只是在开始时检查PID文件是否存在并被锁定(或);如果是,则表示此程序的另一个实例仍在运行。如果没有,它将创建(或重写)PID文件并锁定它

flock/lockf锁的优点是,在程序终止时,操作系统会自动移除锁

请参见此处如何在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"
因为os.system(“ps ax | grep sample_python.py”)返回0。这不是真的

看看这个问题:

你必须写作

os.popen('cat /etc/services').read() 
但是这样的话你总是会去“失败”,因为你的脚本已经开始了。您必须计算返回的行数

在这里查看单个实例的变体:

我写了这样的剧本。我在开始时创建了一个具有任意名称的文件,并在结束时删除了它。这是守护程序脚本。开始时,我检查了该文件是否存在

不错的变体在这里:


与其使用
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)

通过输入,比如,
导入时间来尝试这一点;time.sleep(20)
在`print(“Pass”)之后并运行此脚本的多个实例;只有一个会失败。

您可以使用跨平台库对进程进行迭代,解析每个进程的命令行,并检查它是否是具有相同脚本路径的python进程,然后您可以在只找到一个实例时停止执行,或者杀死/停止旧实例并继续使用新实例

导入操作系统
导入psutil
导入系统
对于psutil.process_iter()中的进程:
如果proc.name()中的“python”:
如果len(proc.cmdline())>1:
script_path=sys.argv[0]
proc_script_path=proc.cmdline()[1]
如果script_path.startswith(“.”+os.sep)或script_path.startswith(“…”+os.sep):
script\u path=os.path.normpath(os.path.join(os.getcwd(),script\u path))
如果proc_script_path.startswith(“.”+os.sep)或proc_script_path.startswith(“..”+os.sep):
proc\u script\u path=os.path.normpath(os.path.join(proc.cwd(),proc\u script\u path))
如果script_path==proc_script_path和os.getpid()!=程序pid:
#proc.kill()#您可以终止所有其他实例
sys.exit()#或者按照您的方式,在此处终止此新实例

grep将在发现不匹配的情况下找到它自己诊断您出现的问题的方法是在脚本运行时和不检查是否有正确的命令行时,首先键入命令行
ps ax…
。然后编写一个python脚本,它只打印
os.system(…
调用的结果,在这两种情况下再次检查是否存在差异。然后您应该能够编写所需的脚本。您可以使用
pgrep
pkill
查找和终止进程,而不包括grep进程本身(还有各种shell实用程序可以确保只有一个副本在运行,尽管它们可能不适合您的情况)我认为它也可能会失败,因为当我执行
ps | grep progname
时,列出的进程之一是grep command.和grep的命令行参数“progname”包括。这可能取决于操作系统。谢谢,但我现在遇到了一个问题。当我运行
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)