bash – 计算进程数并终止它们
我正在编写一个脚本来杀死同一进程的所有实例.由于它将在
Linux,AIX,HP-UX和Solaris上使用,我只需要使用内置的bash(sh)函数.这就是为什么killall,pkill等不适合我的原因.
一旦只有一个进程的实例,就应该以传统方式杀死它: kill -TERM `ps -ef | grep -v grep | grep $process | awk '{print $2}'` 但是有时程序会运行额外的实例,这就是ps -ef |的原因…返回多个PID.这需要报告. 例: bash-3.2$ps -ef | grep -v grep | grep perl | awk '{print $2}' 5267 5268 5269 5270 5271 我的想法是将这些值存储在临时变量中,然后在for循环中向每个值发送kill信号. bash-3.2$tmp=`ps -ef | grep -v grep | grep perl | awk '{print $2}'` bash-3.2$echo $tmp 5267 5268 5269 5270 5271 但是,如果发生这种情况,我仍然需要这些信息(存在多少个实例). 无论如何,问题减少了如何检查$tmp变量存储多少个值? 解决方法
要获得最大
portability和可靠性,请使用-A(-IX的POSIX同义词)和使用-o而不是-f的自定义格式.
您对ps输出的过滤很脆弱:它可能与其他进程匹配.您必须排除grep进程,并且您可能还需要排除脚本,并且可能还有其他完全无辜的进程(例如您的脚本本身)被捕获,因为它们的命令行恰好包含$process as子串.尽可能严格地过滤.使用ps -o pid = -o comm =,只得到两列(PID和没有参数的命令),没有标题. 你不需要使用循环来执行查杀,kill接受多个参数.对于计数,让shell执行它:你有一个以空格分隔的数字列表,让shell执行单词拆分(使用$(…)外部引号)并计算结果字数($#). count_and_kill_processes () { set -- $(ps -A -o pid= -o comm= | awk -v "name=$process" '$2 == name {print $1}') count=$# if [ $# -ne 0 ]; then kill "$@"; fi } count_and_kill_processes foo # now the number of killed processes is in $count 如果您的shell在所有计算机上都是bash或ksh,则可以使用数组. pids=($(ps -A -o pid= -o comm= | awk -v "name=$process" '$2 == name {print $1}') ) if [[ $# -ne 0 ]]; then kill "$@"; fi # the number of killed processes is ${#pids} (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |