基于nice value(bash)

时间:2015-09-28 20:22:02

标签: linux bash shell

我目前正在做一个练习,要求我写一个杀死"睡眠"基于它的好价值的过程。因此,在一个终端中,当我在另一个终端中运行我的脚本时,将立即终止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时,它会坚持不能打开它。可能出现什么问题?

3 个答案:

答案 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的行。(因为niceps输出的每一行上的第二个值,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> hps -C sleep ho中禁止输出列名称(标题)
  • read将相应值分配给变量pidnice
  • 如果您愿意,
  • 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