我经常需要在编程期间杀死进程。
我现在的做法是:
[~]$ 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>
答案 0 :(得分:1234)
在bash
中,你应该可以:
kill $(ps aux | grep '[p]ython csp_build.py' | awk '{print $2}')
有关其运作的详情如下:
ps
为您提供所有流程的列表。grep
的{{1}}过滤器可以阻止您自己选择实际的[p]
进程。grep
只会为您提供每行的第二个字段,即PID。awk
构造意味着执行$(x)
然后获取其输出并将其放在命令行上。上面该构造中的x
管道的输出是进程ID列表,因此您最终得到ps
之类的命令。以下是一份显示实际情况的成绩单:
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
和{ {1}}(因为他们都有sleep 3600
,这不是火箭科学。)
但是,grep sleep
不会在其中创建包含sleep
的流程,而是会创建ps -ef | grep '[s]leep'
,而这里是棘手的一点:sleep
找不到它因为它正在寻找正则表达式“字符类grep '[s]leep'
中的任何字符(grep
)后跟[s]
。
换句话说,它正在寻找s
,但grep进程为leep
,其中没有sleep
。
当我看到这个(由SO在这里的人)时,我立即开始使用它,因为
grep '[s]leep'
少一个过程;和答案 1 :(得分:117)
如果你有pkill,
pkill -f csp_build.py
如果您只想对进程名称(而不是完整的参数列表)进行grep,请不要使用-f
。
答案 2 :(得分:78)
<强> 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"
}
答案 3 :(得分:14)
尝试使用
ps aux | grep 'python csp_build.py' | head -1 | cut -d " " -f 2 | xargs kill
答案 4 :(得分:13)
killall -r regexp
-r, --regexp
将进程名称模式解释为扩展正则表达式。
答案 5 :(得分:9)
您只能使用pkill '^python*'
进行正则表达式进程查杀。
如果你想在杀死之前看到你要杀死或发现的东西,只需使用pgrep -l '^python*'
,其中-l输出也是进程的名称。如果你不想使用
pkill
,只使用:
pgrep '^python*' | xargs kill
答案 6 :(得分:6)
使用pgrep - 在许多平台上都可用:
kill -9 `pgrep -f cps_build`
pgrep -f将巧合地返回所有PID&#34; cps_build&#34;
答案 7 :(得分:5)
要按关键字midori
终止流程,例如:
kill -SIGTERM $(pgrep -i midori)
答案 8 :(得分:5)
你可以用awk和backtics做到这一点
ps auxf |grep 'python csp_build.py'|`awk '{ print "kill " $2 }'`
awk中的$ 2打印第2列,而backtics运行打印的语句。
但更简洁的解决方案是让python进程在/ var / run中存储它的进程id,然后你就可以简单地读取该文件并将其删除。
答案 9 :(得分:4)
我的任务是杀死与特定目录中的regexp匹配的所有内容(在selenium测试之后并非所有内容都停止)。这对我有用:
for i in `ps aux | egrep "firefox|chrome|selenium|opera"|grep "/home/dir1/dir2"|awk '{print $2}'|uniq`; do kill $i; done
答案 10 :(得分:3)
仅使用awk
(和ps
)的方法:
ps aux | awk '$11" "$12 == "python csp_build.py" { system("kill " $2) }'
通过使用字符串相等性测试,我防止匹配此过程本身。
答案 11 :(得分:3)
ps -o uid,pid,cmd|awk '{if($1=="username" && $3=="your command") print $2}'|xargs kill -15
答案 12 :(得分:3)
将-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
答案 13 :(得分:2)
我开始使用这样的东西:
kill $(pgrep 'python csp_build.py')
答案 14 :(得分:1)
这将仅返回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的更多信息
答案 15 :(得分: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 ......)
答案 16 :(得分:1)
解决方案将使用精确模式过滤进程,解析pid并构造用于执行kill进程的参数列表:
ps -ef | grep -e <serviceNameA> -e <serviceNameB> -e <serviceNameC> |
awk '{print $2}' | xargs sudo kill -9
来自文档的说明:
ps 实用程序显示标题行,然后显示包含以下内容的行 有关具有控制终端的所有过程的信息。
-e 显示有关其他用户进程(包括那些进程)的信息
-f 显示uid,pid,父pid,最近的CPU使用率,进程启动
grep 实用程序搜索任何给定的输入文件,并选择要输入的行
-e 模式,--regexp = pattern 指定在搜索输入期间使用的模式:输入 如果它匹配任何指定的模式,则选择行。 当使用多个-e选项时,此选项最有用 指定多个模式,或模式以破折号开头 (`-')。
xargs -构造参数列表并执行实用程序
杀死-终止或发出信号
数字 9 信号-杀死(不可捕获,不可忽略的杀戮)
示例:
ps -ef | grep -e node -e loggerUploadService.sh - -e applicationService.js |
awk '{print $2}' | xargs sudo kill -9
答案 17 :(得分:1)
您不需要ps的用户开关。
kill `ps ax | grep 'python csp_build.py' | awk '{print $1}'`
答案 18 :(得分:1)
从常见的 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
答案 19 :(得分:0)
如果pkill -f csp_build.py
没有终止进程,则可以添加-9
发送终止信号,该信号不会被忽略。即pkill -9 -f csp_build.py
答案 20 :(得分:0)
-C
命令的 ps
标志-C cmdlist
Select by command name. This selects the processes whose
executable name is given in cmdlist.
因此,如果您按标准shebang运行脚本并按他的名字调用它们:
/path/to/csp_build.py
你可能会发现它们
ps -C csp_build.py
所以
kill $(ps -C csp_build.py ho pid)
可能就够了。
比这个问题中的大多数其他答案要强一点,但仍然要快得多......
如果你不知道这是如何运行的,或者如果你运行它们
python csp_build.py
python3 csp_build.py
python /path/to/csp_build.py
您可以通过运行找到它们:
ps -C python,python3,csp_build.py who pid,cmd | grep csp_build.py
然后使用 sed
:
kill $(ps -C python,python3,csp_build.py who pid,cmd |
sed -ne '/csp_build.py/s/^ *\([0-9]\+\) .*$/\1/p')
答案 21 :(得分:0)
我使用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”的进程。
答案 22 :(得分:0)
我用这个来杀死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)
答案 23 :(得分:-1)
您可以使用以下命令列出命令的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}'`
这解决了我的问题。如果您不小心杀死了某个进程,请随时准备重启进程。
答案 24 :(得分:-1)
在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
命令,以终止所有进程。答案 25 :(得分:-1)
以下命令将派上用场:
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
如果进程仍然卡住,请使用&#34; -9&#34;扩展到hardkill,如下:
kill -9 $(ps -elf | grep top| awk {'print $4'})
希望有帮助......!