-
2020-12-03 12:10:14
我正在尝试启动一个具有root权限的进程,稍后再终止它。在
但由于某些原因,我不能让它工作。在
下面是一个小脚本来重现我的问题(免责声明:代码有点脏,它只用于bug再现):import os
import time
import subprocess
command = ["sudo", "sleep", "25"]
process = subprocess.Popen(command,
bufsize=1,
stdin=open(os.devnull),
stderr=subprocess.PIPE,
stdout=subprocess.PIPE)
def kill():
pid = process.pid
cmd = "sudo kill %s" % pid
print(cmd)
print(os.system(cmd))
time.sleep(2)
kill()
stdout, stderr = process.communicate()
print("stdout: " + stdout)
print("stderr: " + stderr)
ret = process.wait()
print("ret: " + str(ret))
这段代码似乎不能杀死我的子进程,但是当我在另一个python实例中启动os.system("sudo kill ")时,它确实起作用了。在
更多相关内容 -
Python 为什么进程会自动启动,杀不死?
2020-12-19 02:30:25就用任务管理器强制结束过几秒又会自动启动出好多,可能一个,两个,三个python进程出来杀了他们,过会又出来,如此反复,不能真正的杀死pytohn有时候只是会多出几个来,杀了就不会再自启了,但是像永远杀不死的情况也是有...现象是这样的,有些时候python运行死了,就用任务管理器强制结束
过几秒又会自动启动出好多,可能一个,两个,三个python进程出来
杀了他们,过会又出来,如此反复,不能真正的杀死pytohn
有时候只是会多出几个来,杀了就不会再自启了,但是像永远杀不死的情况也是有发生过的
这样谁受得了啊,无限自启,还越来越多
有人遇到类似的问题吗?怎么解决?
就一段普通的代码(代码会造成线程死锁):
import threading
import time
class MyThread(threading.Thread):
def run(self):
global num
time.sleep(1)
if mutex.acquire(1):
num = num+1
msg = self.name+' run!'
print(msg)
# 卡在这里了,自身不release就要接着acquire,不可能
mutex.acquire()
print('acquire')
mutex.release()
print('release 1')
mutex.release()
print('release 2')
num = 0
mutex = threading.Lock()
def test():
for i in range(5):
t = MyThread()
t.start()
if __name__ == '__main__':
test()
换成正常运行的也是会出现类似的问题(这个可以正常运行):
import threading
import time
class MyThread(threading.Thread):
def run(self):
global num
time.sleep(1)
if mutex.acquire(1):
num = num+1
msg = self.name+' run!'
print(msg)
# 卡在这里了,自身不release就要接着acquire,不可能
# mutex.acquire()
# print('acquire')
# mutex.release()
# print('release 1')
mutex.release()
print('release 2')
num = 0
mutex = threading.Lock()
def test():
for i in range(5):
t = MyThread()
t.start()
if __name__ == '__main__':
test()
但是还是会出现上面的情况
kp是cmd命令:
taskkill /F /IM python.exe()
有时候又好了,比如现在:
就是不知道为什么会这样,明明程序中并没有用多进程还给我这么搞
代码不限于上面的那个,有些时候写些其他东西也会出现类似的情况
求解,谢谢!
是win7下,python3.6 64位,包装了好多(应该不是包的问题吧),python我觉得我的也没啥问题
我可能就是不知道pytohn运行机制吧
貌似找到了一个怀疑的原因:
我是用sublime text3写python,装过这些插件:
原来就发现某个插件(记不得名称了),会自动查找我代码的语法错误,它会运行我本地的pytohn,造成运行好几个python进程,造成我cpu占用过高(其实也没多高),然后我一怒之下就把那插件给卸载了
刚发生的状况为,我先kp掉所有的pytohn进程,然后切换回sublime text3中,发现sub test 假死,卡了1秒多,然后多了几个pytohn进程,十有八九吧,不是代码的问题233333
后来我关了sub,kp掉pytohn,打开sub,又多几个python,没跑了,十有八九,要不sub的问题,要不sub插件的问题
有了解sub插件的大佬嘛?求解释,大概应该是哪几个插件有问题?
还是我又理解错了,不是sub的问题??
谢谢
对了,刚关了sub,python就没了….
我是不是该抛弃sub了….
终于知道为啥要用vim写代码了,我感觉我代码有问题都是运行后编译器高速我的,sub感觉还算好用吧,要不就是我强迫症2333333
-
深入浅析python定时杀进程
2020-12-24 02:55:35因为这个脚本不会长期使用,因此采取临时办法,新开一个子线程固定周期杀死phantomjs进程,这样selenium就会在block最多不超过此周期后返回。当然在爬虫脚本中做一些微调防止部分url被跳过 定时执行任务采用sched... -
在python中通过命令杀死进程
2021-03-06 04:52:14我试图避免像这样终止进程:import subprocesscommand = "pkill python"process = subprocess.Popen(command.split(), stdout=subprocess.PIPE)但是相反,我试图杀死一个特定的进程,而不是所有的python进程。...我试图避免像这样终止进程:
import subprocess
command = "pkill python"
process = subprocess.Popen(command.split(), stdout=subprocess.PIPE)
但是相反,我试图杀死一个特定的进程,而不是所有的python进程。假设process命令称为“ python test.py”,我想杀死该命令,而其他python进程保持完整。不知道我该怎么做。
平台是Linux / Ubuntu
澄清一下,这就是我执行ps -aux |时要完成的工作。grep“ python”我看到了:
sshum 12115 68.6 2.7 142036 13604 pts/0 R 11:11 0:13 python test.py &
sshum 12128 0.0 0.1 11744 904 pts/0 S+ 11:12 0:00 grep --color=auto test.py
我想杀死进程12115,但是我不确定如何在不杀死所有其他python进程的情况下进行此操作。
编辑:这是我想出的解决方案,但它看起来并不特别优雅...
command = "ps aux"
process = subprocess.Popen(command.split(), stdout=subprocess.PIPE)
output = process.communicate()[0].split("\n")
try:
for p in output:
if "python test.py" in p:
l = p.split(" ")
l = [x for x in l if x!='']
pid = int(l[1])
os.kill(pid, 9)
except:
pass
解决方案
pgrep(-f)中有一个标志,它允许在整个命令行中搜索进程,而不仅仅是名称。
ps aux|grep python尝试重现结果时在我的机器上的输出:
shadowk+ 1194 2.4 0.5 354240 70748 ? S 11:29 0:46 /usr/bin/python /usr/share/chronoslnx/main.py
shadowk+ 1239 0.1 0.6 508548 84080 ? Sl 11:29 0:03 /usr/bin/python2 /usr/share/kupfer/kupfer.py
shadowk+ 1245 0.0 0.4 296732 60956 ? S 11:29 0:00 /usr/bin/python2 -O /usr/share/wicd/gtk/wicd-client.py --tray
shadowk+ 2279 99.7 0.0 22800 7372 pts/3 R+ 12:00 0:30 /usr/bin/python ./test.py
shadowk+ 2289 0.0 0.0 10952 2332 pts/0 S+ 12:01 0:00 grep --color=auto python
就我而言,以下任何命令都将获取正在运行的./test py文件的PID:
pgrep -f 'python ./test.py'
pgrep -f 'test.py'
第二个代码更接近您要寻找的代码,因此调整后的代码如下所示(对于Python 2.x,您只需要从e.output中删除.decode()调用,并删除获取PID的调用):
import subprocess
import os
try:
needed_pid=subprocess.check_output(['pgrep','-f','test.py']).decode()
except subprocess.CalledProcessError as e:
print("pgrep failed because ({}):".format(e.returncode) , e.output.decode())
else:
try:
os.kill(int(needed_pid), 9)
print("We killed test.py!")
except ProcessLookupError as e:
print("We tried to kill an old entry.")
except ValueError as e:
print("Well, there's no test.py...so...yeah.")
如果您想直接调用pkill进行相同的操作,也可以像这样更简单地执行此操作:
import subprocess
subprocess.call(['pkill', '-f', 'test.py'])
-
Python:当父代死亡时如何杀死子进程?
2021-02-09 12:36:03(如果绝对有必要杀死子进程,那么您可能需要将死亡信号设置为SIGKILL而不是SIGTERM;您链接的代码使用SIGTERM,但是如果孩子确实有选择忽略SIGTERM. )在Windows上,最可靠的选择是使用Job object.这个想法是您创建一个...呃,我昨天刚刚研究一下这个!假设你不能改变子程序:
在Linux上,prctl(PR_SET_PDEATHSIG,…)可能是唯一可靠的选择. (如果绝对有必要杀死子进程,那么您可能需要将死亡信号设置为SIGKILL而不是SIGTERM;您链接的代码使用SIGTERM,但是如果孩子确实有选择忽略SIGTERM. )
在Windows上,最可靠的选择是使用Job object.这个想法是您创建一个“作业”(一种用于进程的容器),然后将子进程放入作业,并设置说明的魔术选项“当没有人持有该作业的”句柄“,然后杀死它中的进程”.默认情况下,作业的唯一“句柄”是您的父进程所持有的“handle”,当父进程中断时,操作系统将通过并关闭其所有句柄,然后注意,这意味着没有打开的句柄工作.因此,根据要求,它会杀死小孩. (如果您有多个子进程,则可以将它们全部分配给相同的作业.)This answer具有使用win32api模块执行此操作的示例代码.该代码使用CreateProcess来启动子代码,而不是subprocess.Popen.原因是它们需要为生成的子进程获取“进程句柄”,并且CreateProcess默认返回.如果你宁愿使用subprocess.Popen,那么这里是一个(未经测试的)该答案的代码副本,它使用subprocess.Popen和OpenProcess而不是CreateProcess:
import subprocess
import win32api
import win32con
import win32job
hJob = win32job.CreateJobObject(None, "")
extended_info = win32job.QueryInformationJobObject(hJob, win32job.JobObjectExtendedLimitInformation)
extended_info['BasicLimitInformation']['LimitFlags'] = win32job.JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE
win32job.SetInformationJobObject(hJob, win32job.JobObjectExtendedLimitInformation, extended_info)
child = subprocess.Popen(...)
# Convert process id to process handle:
perms = win32con.PROCESS_TERMINATE | win32con.PROCESS_SET_QUOTA
hProcess = win32api.OpenProcess(perms, False, child.pid)
win32job.AssignProcessToJobObject(hJob, hProcess)
在技术上,这里有一个很小的竞争条件,如果孩子在Popen和OpenProcess调用之间死亡,你可以决定是否要担心.
使用作业对象的一个缺点是,当在Vista或Win7上运行时,如果您的程序从Windows shell启动(即通过单击图标),那么可能会出现already be a job object assigned并尝试创建新的作业对象将失败. Win8修复这个(通过允许作业对象嵌套),或者如果你的程序是从命令行运行的话,那应该是正常的.
如果你可以修改孩子(例如,像使用多重处理一样),那么可能最好的选择是以某种方式将父代的PID传递给孩子(例如,作为命令行参数,或者在args =参数中进行multiprocessing.Process)接着:
在POSIX上:在孩子中产生一个只会偶尔调用os.getppid()的线程,如果返回值停止匹配从父进程传入的pid,则调用os._exit(). (这种方法可以移植到所有Unix,包括OS X,而prctl技巧是Linux特定的.)
在Windows上:在使用OpenProcess和os.waitpid的子代中生成一个线程.使用ctypes的例子:
from ctypes import WinDLL, WinError
from ctypes.wintypes import DWORD, BOOL, HANDLE
# Magic value from http://msdn.microsoft.com/en-us/library/ms684880.aspx
SYNCHRONIZE = 0x00100000
kernel32 = WinDLL("kernel32.dll")
kernel32.OpenProcess.argtypes = (DWORD, BOOL, DWORD)
kernel32.OpenProcess.restype = HANDLE
parent_handle = kernel32.OpenProcess(SYNCHRONIZE, False, parent_pid)
# Block until parent exits
os.waitpid(parent_handle, 0)
os._exit(0)
这样可以避免我提到的任务对象可能出现的问题.
如果你想要真的,真的确定,那么你可以结合所有这些解决方案.
希望有帮助!
-
Python多处理:优雅地杀死进程
2020-12-09 05:06:39目标是将配置文件重新加载到内存中,所以我想杀死所有子进程并创建其他进程,后者将读取新的配置文件. 编辑:添加了更多代码来解释我正在运行一段时间的True循环 编辑:这是@dano suggestion之后的新代码 def get_... -
停止python脚本而不杀死python进程
2020-11-25 23:52:49我想知道是否有一种方法可以在不杀掉进程的情况下,像处理此代码那样,通过编程来停止python脚本的执行:12import syssys.exit()它是相当于ctrl+c的代码如果"停止",你的意思是"暂停,以后再继续",试试raw_input(... -
python-如何使用子进程modu杀死(或避免)僵尸进程
2021-02-09 12:36:04除非杀死父python进程,否则无法杀死该子进程。有没有办法杀死子进程而不杀死父进程? 我知道我可以通过使用wait()来做到这一点,但是我需要使用no_wait()运行脚本。Dave asked 2020-01-27T06:25... -
Python笔记:Linux和Windows下用python找到并杀死进程
2021-05-10 14:21:29如何使用python找到进程并杀死该进程,或者是确认某进程有没有在运行,这些功能的使用场景是很多的。比如你的服务器上有一个服务脚本server.py需要运行某个程序去做某些操作,但是在脚本运行这个程序好半天没返回,... -
python 根据pid杀死相应进程的方法
2020-11-29 12:16:40python 根据pid杀死相应进程的方法用python语言实现根据pid杀死相应进程kill_process.py代码如下#! /usr/bin/python# -*- coding: utf-8 -*-import osimport sysimport signaldef kill(pid):try:a = os.kill(pid, ... -
Python踩坑之旅其一杀不死的Shell子进程
2021-02-10 22:39:15PythonPython开发Python语言Python踩坑之旅其一杀不死的Shell子进程 1.1 踩坑案例踩坑的程序是个常驻的Agent类管理进程, 包括但不限于如下类型的任务在执行:a. 多线程的网络通信包处理和控制Master节点交互有固定... -
Python3实际上并没有杀死进程
2021-02-09 16:25:04我正在运行Python3的一些进程,但是它们没有被终止。这是一个问题的MCVE,它运行在Linux 16.04和python3.5上。我用QJoypad和Sublime3试过这个。在import subprocessimport timep_joypad = subprocess.Popen(['... -
python - 按名称杀死进程?
2020-12-09 05:05:37python - 按名称杀死进程?我正试图杀死一个进程(特别是iChat)。 在命令行中,我使用以下命令:ps -A | grep iChat然后:kill -9 PID但是,我不确定如何将这些命令转换为Python。Aaron asked 2019-04-24T18:21:04Z14... -
Python获取应用进程PID杀死Linux进程
2022-03-21 17:19:55Python获取应用进程PID杀死Linux进程 代码如下(示例): import os import subprocess import time def get_process_id(name): child = subprocess.Popen(["pgrep", "-f", name], stdout=subprocess.PIPE, shell=... -
python杀掉某个指定的进程
2021-12-09 18:18:35它主要用来做系统监控,性能分析,进程管理。 使用pustil库之前,需要先安装,安装命令如下: pip install pustil 进程信息 pids = psutil.pids() for pid in pids: p = psutil.Process(pid) # get process nam -
python 杀死subprocess.Popen下打开的所有子进程
2021-02-09 12:35:54写在之前:先来明确以下几点:1、subprocess.Popen:这...即 父进程: 组长进程组长进程组长进程标识: 其进程组ID==其父进程ID组长进程可以创建一个进程组,创建该进程组中的进程,然后终止只要进程组中有一个进程存... -
Python:当父进程死亡时,如何杀死子进程?
2020-11-29 12:17:38假设您不能更改子程序:在Linux上,prctl(PR_SET_PDEATHSIG, ...)可能是唯一可靠的选择。(如果绝对有必要终止子进程,那么您可能希望将终止信号设置为SIGKILL而不是SIGTERM;您链接到的代码使用SIGTERM,但是如果子... -
Python 之杀不死的Shell子进程
2019-11-23 14:48:171.1 踩坑案例 踩坑的程序是个常驻的Agent类管理进程, 包括但不限于如下类型的任务在执行: a. 多线程的网络通信包处理 和控制Master节点交互 有固定Listen端口 ...想到可能进程没被杀死, 是不是... -
杀不死的Python程序:Windows下实现Python出错后重启且定时监视重启.doc
2016-09-01 17:46:17通过本文你将学到如何编写一个杀不死的Python程序。你还将学到多进程编程、多线程编程、捕捉异常、每隔... -
Python中开启进程运行shell与杀掉进程
2021-06-01 01:11:26环境ubuntu 18.04 64bitpython 3.8前言在实际项目中,经常会有这样的需求:某个进程已经在后台运行了,现在想通过进程名来杀掉它通过代码的方式启动一个新的进程来运行特定... -
python获取进程pid并且杀掉进程
2020-11-29 12:16:41python程序退出方式sys.exit()执行该语句会直接退出程序,这也是经常使用的方法,也不需要考虑平台等因素的影响,一般是退出Python程序的首选方法。该方法中包含一个参数status,默认为0,表示正常退出,也可以为1,... -
kill 所有python进程
2021-05-17 18:05:44ps -ef|grep python|grep -v grep|cut -c 9-15|xargs kill -15 管道符“|”用来隔开两个命令,...“grep python”的输出结果是,所有含有关键字“python”的进程,这是python程序 “grep -v grep”是在列出的进程中去 -
python 判断linux进程,并杀死进程的实现方法
2020-12-24 23:23:20python 判断linux进程,并杀死进程的实现方法如下所示:'''@author: Jacobpc'''import osimport sysimport subprocessdef get_process_id(name):child = subprocess.Popen(["pgrep","-f",name],stdout=subprocess.... -
python fork杀死子进程,循环任务
2020-12-11 10:48:03当子进程执行时间过长(可能由于异常导致执行时间超过正常时间),父进程可以杀死子进程,并在下一个循环中重新开启一个子进程执行之前的任务。 代码如下: import os import signal # 导入signal 包 if __name__ =... -
linux-如何查找/杀死特定的python程序
2020-12-04 01:21:19此VM中运行两个不同的python程序一个是后台工作,他监视一个文件夹,然后“做一些事情”(有几名工人)10835 ? Sl 0:03 python main.py10844 ? Sl 34:02 python main.py10845 ? S 33:43 python main.py第二个通过脚本... -
Python:杀死进程并关闭它在其中打开的窗口(windows)
2020-12-04 01:22:41在我对用python实例化新进程完全陌生;这是我第一次真正尝试这样做。所以基本上,我有一个相关的功能:def get_report(id):path = report_path(id)if not path:raise NameErrorpage = get_page(path, ... -
Linux如何Kill掉python进程
2022-04-18 19:05:31一、显示所有进程 ps -ef | grep python 二、Kill掉不用的进程 上面是进程的进程号 kill -s 9 进程号 若提示没有权限 则使用下面的命令 sudo kill -s 9 进程号