我经常需要在编程期间杀死进程。
我现在这样做的方式是:
[~]$ ps aux | grep 'python csp_build.py'
user 5124 1.0 0.3 214588 13852 pts/4 Sl+ 11:19 0:00 python csp_build.py
user 5373 0.0 0.0 8096 960 pts/6 S+ 11:20 0:00 grep python csp_build.py
[~]$ kill 5124
如何自动提取进程ID并在同一行中终止它?
像这样:
[~]$ ps aux | grep 'python csp_build.py' | kill <regex that returns the pid>
在bash
,你应该能够做到:
kill $(ps aux | grep '[p]ython csp_build.py' | awk '{print $2}')
有关其运作的详情如下:
ps
为您提供所有流程的列表。grep
过滤器基于你的搜索字符串,[p]
是一个技巧,阻止你拿起实际的grep
过程本身。awk
只给你每行的第二个字段,即PID。$(x)
构造意味着执行x
然后获取其输出并将其放在命令行上。上面构造中的ps
管道的输出是进程ID列表,因此您最终会得到像kill 1234 1122 7654
这样的命令。这是一个显示它在行动的成绩单:
pax> sleep 3600 &
[1] 2225
pax> sleep 3600 &
[2] 2226
pax> sleep 3600 &
[3] 2227
pax> sleep 3600 &
[4] 2228
pax> sleep 3600 &
[5] 2229
pax> kill $(ps aux | grep '[s]leep' | awk '{print $2}')
[5]+ Terminated sleep 3600
[1] Terminated sleep 3600
[2] Terminated sleep 3600
[3]- Terminated sleep 3600
[4]+ Terminated sleep 3600
你可以看到它终止了所有的睡眠者。
更详细地解释grep '[p]ython csp_build.py'
位:
当你做sleep 3600 &
跟随ps -ef | grep sleep
时,你往往会得到sleep
的两个过程,sleep 3600
和grep sleep
(因为他们都有sleep
,这不是火箭科学)。
然而,ps -ef | grep '[s]leep'
不会在其中创建一个sleep
的过程,而是创建grep '[s]leep'
,这里是棘手的一点:grep
找不到它,因为它正在寻找正则表达式“字符类[s]
中的任何字符(这是s
) )其次是leep
。
换句话说,它正在寻找sleep
,但grep过程是grep '[s]leep'
,其中没有sleep
。
当我看到这个(由某人在这里)时,我立即开始使用它,因为
| grep -v grep
少一个过程;和我的任务是杀死与特定目录中的regexp相匹配的所有内容(在selenium测试之后并非所有内容都停止)。这对我有用:
for i in `ps aux | egrep "firefox|chrome|selenium|opera"|grep "/home/dir1/dir2"|awk '{print $2}'|uniq`; do kill $i; done
仅使用awk
(和ps
)的方法:
ps aux | awk '$11" "$12 == "python csp_build.py" { system("kill " $2) }'
通过使用字符串相等测试我防止匹配此过程本身。
ps -o uid,pid,cmd|awk '{if($1=="username" && $3=="your command") print $2}'|xargs kill -15
把-f给pkill
pkill -f /usr/local/bin/fritzcap.py
.py文件的确切路径是
# ps ax | grep fritzcap.py
3076 pts/1 Sl 0:00 python -u /usr/local/bin/fritzcap.py -c -d -m
我开始使用这样的东西:
kill $(pgrep 'python csp_build.py')
从常见的PPID开始杀死我们自己的进程非常频繁,与–P
标志相关的pkill对我来说是一个赢家。使用@ ghostdog74示例:
# sleep 30 &
[1] 68849
# sleep 30 &
[2] 68879
# sleep 30 &
[3] 68897
# sleep 30 &
[4] 68900
# pkill -P $$
[1] Terminated sleep 30
[2] Terminated sleep 30
[3]- Terminated sleep 30
[4]+ Terminated sleep 30
ps不需要用户开关。
kill `ps ax | grep 'python csp_build.py' | awk '{print $1}'`
在某些情况下,我想像这样同时杀死进程:
➜ ~ sleep 1000 & [1] 25410 ➜ ~ sleep 1000 & [2] 25415 ➜ ~ sleep 1000 & [3] 25421 ➜ ~ pidof sleep 25421 25415 25410 ➜ ~ kill `pidof sleep` [2] - 25415 terminated sleep 1000 [1] - 25410 terminated sleep 1000 [3] + 25421 terminated sleep 1000
但是,我认为在你的情况下这有点不合适。(可能在后台运行python a,python b,python x ...)
这将仅返回pid
pgrep -f 'process_name'
所以要在一行中杀死任何进程:
kill -9 $(pgrep -f 'process_name')
或者,如果您知道该过程的确切名称,您也可以尝试pidof:
kill -9 $(pidof 'process_name')
但是,如果您不知道该过程的确切名称,pgrep
会更好。
如果有多个进程以相同的名称运行,并且您想要终止第一个进程,那么:
kill -9 $(pgrep -f 'process_name' | head -1)
另外要注意的是,如果您担心区分大小写,那么您可以像在grep中一样添加-i选项。例如:
kill -9 $(pgrep -fi chrome)
有关man 7 signal
或man signal
和man pgrep
的信号和pgrep的更多信息
我用这个来杀死Firefox,当它被脚本抨击和cpu抨击:)用您想要死的应用程序替换'Firefox'。我在Bash shell上 - OS X 10.9.3 Darwin。
kill -Hup $(ps ux | grep Firefox | awk 'NR == 1 {next} {print $2}' | uniq | sort)
如果你有pkill,
pkill -f csp_build.py
如果你只想要对进程名称(而不是完整的参数列表)进行grep,那么请不要使用-f
。
我使用gkill processname
,其中gkill是以下脚本:
cnt=`ps aux|grep $1| grep -v "grep" -c`
if [ "$cnt" -gt 0 ]
then
echo "Found $cnt processes - killing them"
ps aux|grep $1| grep -v "grep"| awk '{print $2}'| xargs kill
else
echo "No processes found"
fi
注意:它不会杀死在命令行中具有“grep”的进程。
以下命令将派上用场:
kill $(ps -elf | grep <process_regex>| awk {'print $4'})
例如,ps -elf | grep top
0 T ubuntu 6558 6535 0 80 0 - 4001 signal 11:32 pts/1 00:00:00 top
0 S ubuntu 6562 6535 0 80 0 - 2939 pipe_w 11:33 pts/1 00:00:00 grep --color=auto top
kill -$(ps -elf | grep top| awk {'print $4'})
-bash: kill: (6572) - No such process
[1]+ Killed top
如果进程仍然卡住,请使用“-9”扩展名进行hardkill,如下所示:
kill -9 $(ps -elf | grep top| awk {'print $4'})
希望有帮助......!
在bash中查找并删除一行中的所有进程。
kill -9 $(ps -ef | grep '<exe_name>' | grep -v 'grep' | awk {'print $2'})
ps -ef | grep '<exe_name>'
- 提供与模式匹配的正在运行的进程详细信息(uname,pid等)列表。输出列表包括此grep
命令,用于搜索它。现在要杀死我们需要忽略这个grep
命令进程。ps -ef | grep '<exec_name>' | grep -v 'grep'
- 使用-v 'grep'
添加另一个grep会删除当前的grep进程。awk
单独获取进程ID。$(...)
中并将其传递给kill
命令,以终止所有进程。您可以使用以下命令列出命令的pid。使用top或更好的使用htop来查看linux中的所有进程。在这里,我想杀死一个名为的进程
ps -ef | grep '/usr/lib/something somelocation/some_process.js' | grep -v grep | awk '{print $2}'
并验证pid。它必须是正确的。要杀死它们使用kill命令。
sudo kill -9 `ps -ef | grep '/usr/lib/something somelocation/some_process.js' | grep -v grep | awk '{print $2}'`
例如: - 来自htop进程列表。
sudo kill -9 `ps -ef | grep '<process>' | grep -v grep | awk '{print $2}'`
这解决了我的问题。如果您不小心杀死进程,请始终准备好重新启动进程。
ps aux | grep -i csp_build | awk '{print $2}' | xargs sudo kill -9
awk '{print $2}'
sudo
是可选的kill -9 5124
,kill -9 5373
等(kill -15更优雅但略慢)我还有.bash_profile中定义的2个快捷方式函数(〜/ .bash_profile用于osx,你必须看看哪些适用于你的* nix机器)。
p csp_build
,p python
等bash_profile代码:
# FIND PROCESS
function p(){
ps aux | grep -i $1 | grep -v grep
}
ka csp_build
,ka python
等
可选的杀戮级别,例如:ka csp_build 15
,ka python 9
bash_profile代码:
# KILL ALL
function ka(){
cnt=$( p $1 | wc -l) # total count of processes found
klevel=${2:-15} # kill level, defaults to 15 if argument 2 is empty
echo -e "\nSearching for '$1' -- Found" $cnt "Running Processes .. "
p $1
echo -e '\nTerminating' $cnt 'processes .. '
ps aux | grep -i $1 | grep -v grep | awk '{print $2}' | xargs sudo kill -klevel
echo -e "Done!\n"
echo "Running search again:"
p "$1"
echo -e "\n"
}
尝试使用
ps aux | grep 'python csp_build.py' | head -1 | cut -d " " -f 2 | xargs kill
killall -r regexp
-r, --regexp
将进程名称模式解释为扩展正则表达式。
您可以仅使用pkill '^python*'
进行正则表达式进程查杀。
如果你想在杀死之前看到你要杀死或找到的东西,只需使用pgrep -l '^python*'
,其中-l输出也是进程的名称。如果您不想使用pkill
,请使用:
pgrep '^python*' | xargs kill
使用pgrep - 在许多平台上都可用:
kill -9 `pgrep -f cps_build`
pgrep -f将返回所有PID重合“cps_build”
你可以用awk和反引号来做到这一点
ps auxf |grep 'python csp_build.py'|`awk '{ print "kill " $2 }'`
awk打印第2列$ 2,反引号运行打印的语句。
但是一个更清晰的解决方案是让python进程在/ var / run中存储它的进程id,然后你可以简单地读取该文件并将其杀死。
要通过关键字midori
来终止进程,例如:
kill -SIGTERM $(pgrep -i midori)