我目前正在做一个练习,要求我写一个杀死"睡眠"基于它的好价值的过程。因此,在一个终端中,当我在另一个终端中运行我的脚本时,将立即终止100的睡眠命令(默认的niceness值为0)。但是,我在编写脚本时遇到了麻烦。以下是我到目前为止的情况:
#!/usr/local/bin/bash
nice="$(ps eo pid,user,nice,command | grep sleep)"
if nice <= 4
then
kill -9 sleep
fi
我的问题是:如何将命令中的nice值转换为可以通过if语句运行的简单变量?
另外,我在运行脚本时遇到了麻烦。当我在一个终端中运行睡眠命令并尝试输入sh kill_sleep.sh
时,它会坚持不能打开它。可能出现什么问题?
答案 0 :(得分:4)
下面的命令将使用niceness&lt; = 4:
杀死所有睡眠过程ps -o pid= -o nice= -C sleep | awk '$2<=4{system("kill " $1)}'
选项-C sleep
告诉ps
仅选择sleep
个命令。
选项-o pid= -o nice=
指定ps
应输出进程ID和nice值,同时省略标题。
在awk命令中,$2<=4
仅选择那些小于或等于4的行。(因为nice
是ps
输出的每一行上的第二个值,awk将其称为$2
。)
对于那些选定的行,运行awk命令system("kill " $1)
。这会在pid上运行shell命令kill
。 (由于PID是ps
输出的每一行的第一个值,因此awk将其引用为$1
。)
kill pid
命令向进程发送默认信号TERM
。此信号允许进程正常关闭。 kill -9
应该almost always be avoided.
答案 1 :(得分:2)
即使没有awk
,您也可以这样做:
read pid nice < <(ps -C sleep ho pid,nice)
if (( $nice <= 4 ))
then kill $pid
fi
-C
仅过滤sleep
输出ps
个命令
{li> h
在ps -C sleep ho
中禁止输出列名称(标题)
read
将相应值分配给变量pid
和nice
kill
可能与-9
<(...)
构造为process substitution,它允许从进程输出中读取,就像它是一个文件一样如果您想反映多个正在运行sleep
个实例的可能性(并删除所有不是 nice 的实例),您可以在ps
中阅读while
输出} loop:
while read pid nice; do
if (($nice <= 4))
then kill $pid;
fi
done < <(ps -C sleep ho pid,nice)
答案 2 :(得分:0)
您可以使用awk
匹配一列并返回另一列:
sleep=$(ps eo pid,nice,command | awk '$3 == "sleep" && $2 <= 4 {print $1}')
if [ "$sleep" ]
then kill $sleep
fi