我尝试使用 python3 开发任务管理器供个人使用。在我的代码中,我使用此命令在 while 循环中列出所有正在运行的进程
ps -eo pid,comm,user,%mem,%cpu | awk '{$4=<Variablehere>*$4/100;}{print;}'
但每次执行时,有三个进程我不希望它们被列出,它们是sh
ps
awk
所以我的问题是,我怎样才能获得这些进程的 PID,以便以后可以将它们从列表中删除
谢谢
[编辑]
导入子流程 从时间导入睡眠类过程数据: 定义 在里面(自己) : mem = next(self._run_command("m")).decode('utf-8').replace("\n","") mem = str(int(浮点数(mem)/1024)) #打印(内存)
self.allprocess = "ps -eo pid,comm,user,%mem,%cpu | awk '{$4="+mem+"*$4/100;}{print;}';" self.ownprocess = "ps -eo pid,comm,user,%mem,%cpu | awk '{$4=(" + mem + "*$4/100);}{print;}' | grep $USER" self.otherprocess = "ps -eo pid,comm,user,%mem,%cpu | awk '{$4=(" + mem + "*$4/100);}{print;}' | grep -v $USER" def _run_command(self,fil): if fil == "a" : command = self.allprocess elif fil == "u" : command = self.ownprocess elif fil == "o" : command = self.otherprocess elif fil == "m" : command = "awk '/MemTotal/ {print $2}' /proc/meminfo" p = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True) for line in iter(p.stdout.readline, b''): if line: yield line while p.poll() is None: sleep(.1) err = p.stderr.read() if p.returncode != 0: print("Error: " + str(err)) @staticmethod def unique(list1 , list2) : ids = [i[0] for i in list2] return [i for i in list1 if i[0] not in ids]; def get(self,choice) : processes = []; for process in self._run_command(choice) : processes.append(process.decode('utf-8').replace("\n","").split()); return processes#[0:(len(processes)-1)-2]; print(processData().get("a"));
我想要的是不列出由于我的程序运行而正在运行的任何进程
答案1
只需插入条件$2 !~ /^(awk|sh|ps)$/
:
ps -eo pid,comm,user,%mem,%cpu | awk '$2 !~ /^(awk|sh|ps)$/ {$4=<Variablehere>*$4/100;}{print;}'
这意味着“如果 $2 不匹配字符串开头,然后是awk
,sh
,或者ps
,然后是字符串结尾“ 然后 ...