Orj*_*anp 595 regex bash terminal awk
我经常需要在编程期间杀死进程.
我现在这样做的方式是:
[~]$ 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
Run Code Online (Sandbox Code Playgroud)
如何自动提取进程ID并在同一行中终止它?
像这样:
[~]$ ps aux | grep 'python csp_build.py' | kill <regex that returns the pid>
Run Code Online (Sandbox Code Playgroud)
pax*_*blo 1310
在bash,你应该能够做到:
kill $(ps aux | grep '[p]ython csp_build.py' | awk '{print $2}')
Run Code Online (Sandbox Code Playgroud)
有关其运作的详情如下:
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
Run Code Online (Sandbox Code Playgroud)
你可以看到它终止了所有的睡眠者.
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; 和gho*_*g74 128
如果你有pkill,
pkill -f csp_build.py
Run Code Online (Sandbox Code Playgroud)
如果您只想对进程名称(而不是完整的参数列表)进行grep,请不要使用-f.
a20*_*a20 83
# FIND PROCESS
function p(){
ps aux | grep -i $1 | grep -v grep
}
Run Code Online (Sandbox Code Playgroud)
ps aux | grep -i csp_build | awk '{print $2}' | xargs sudo kill -9 awk '{print $2}' 是可选的sudo,kill -9 5124等等(杀-15更优美,但稍慢)我还有.bash_profile中定义的2个快捷方式函数(〜/ .bash_profile用于osx,你必须看看哪些适用于你的*nix机器).
kill -9 5373,p csp_build等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"
}
Run Code Online (Sandbox Code Playgroud)
p python,ka csp_build等ka python,ka csp_build 15bash_profile代码:
# FIND PROCESS
function p(){
ps aux | grep -i $1 | grep -v grep
}
Run Code Online (Sandbox Code Playgroud)
Rah*_*hul 14
尝试使用
ps aux | grep 'python csp_build.py' | head -1 | cut -d " " -f 2 | xargs kill
Run Code Online (Sandbox Code Playgroud)
您只能pkill '^python*'用于正则表达式进程查杀.
如果你想在杀戮之前看到你要杀死或找到的东西,只需使用pgrep -l '^python*'-l输出也是进程的名称.如果您不想使用
pkill,请使用:
pgrep '^python*' | xargs kill
解决方案是使用精确的模式过滤进程,解析 pid,并构建用于执行终止进程的参数列表:
ps -ef | grep -e <serviceNameA> -e <serviceNameB> -e <serviceNameC> |
awk '{print $2}' | xargs sudo kill -9
Run Code Online (Sandbox Code Playgroud)
文档的解释:
ps实用程序显示标题行,后面的行包含有关具有控制终端的所有进程的信息。
-e显示有关其他用户进程的信息,包括那些
-f显示uid、pid、父pid、最近CPU使用率、进程启动情况
grep实用程序搜索任何给定的输入文件,选择符合以下条件的行
-e pattern, --regexp=pattern 指定在输入搜索期间使用的模式:如果输入行与任何指定模式匹配,则选择该输入行。当使用多个 -e 选项指定多个模式或模式以短划线 (`-') 开头时,此选项最有用。
xargs - 构造参数列表并执行实用程序
Kill - 终止或向进程发出信号
9号信号 - KILL(不可捕获、不可忽略的杀戮)
例子:
ps -ef | grep -e node -e loggerUploadService.sh -e applicationService.js |
awk '{print $2}' | xargs sudo kill -9
Run Code Online (Sandbox Code Playgroud)
小智 7
使用pgrep - 在许多平台上都可用:
kill -9 `pgrep -f cps_build`
Run Code Online (Sandbox Code Playgroud)
pgrep -f将返回所有PID重合"cps_build"
这只会返回pid
pgrep -f 'process_name'
Run Code Online (Sandbox Code Playgroud)
因此,要在一行中杀死任何进程:
kill -9 $(pgrep -f 'process_name')
Run Code Online (Sandbox Code Playgroud)
或者,如果您知道进程的确切名称,也可以尝试使用pidof:
kill -9 $(pidof 'process_name')
Run Code Online (Sandbox Code Playgroud)
但是,如果您不知道该进程的确切名称,pgrep那就更好了。
如果有多个运行相同名称的进程,并且您想杀死第一个进程,则:
kill -9 $(pgrep -f 'process_name' | head -1)
Run Code Online (Sandbox Code Playgroud)
另请注意,如果您担心区分大小写,则可以像在grep中一样添加-i选项。例如:
kill -9 $(pgrep -fi chrome)
Run Code Online (Sandbox Code Playgroud)
有关信号,并在p纤ep更多信息man 7 signal或man signal与man pgrep
你可以用awk和backtics做到这一点
ps auxf |grep 'python csp_build.py'|`awk '{ print "kill " $2 }'`
Run Code Online (Sandbox Code Playgroud)
awk中的$ 2打印第2列,而backtics运行打印的语句.
但是一个更清晰的解决方案是让python进程在/ var/run中存储它的进程id,然后你可以简单地读取该文件并将其杀死.
我的任务是杀死所有放置在特定目录中的与regexp匹配的东西(在硒测试后,一切不会停止)。这为我工作:
for i in `ps aux | egrep "firefox|chrome|selenium|opera"|grep "/home/dir1/dir2"|awk '{print $2}'|uniq`; do kill $i; done
Run Code Online (Sandbox Code Playgroud)