防止POSIX xargs尝试运行空命令

时间:2015-12-23 16:51:51

标签: shell posix kill xargs

我对bash不太好,但我正在尝试创建一个脚本来杀死一些java进程:

/usr/ucb/ps -auxww    \
  | grep 'XUnit'      \
  | grep -v 'grep'    \
  | cut -c -2000      \
  | awk '{print $2;}' \
  | xargs kill
此处使用了

cut,因为awk可能会因为过长的行而失败(请参阅POSIX specification for awk中对LINE_MAX限制的引用。)

当没有这样的进程时会出现问题 - xargs尝试在没有参数的情况下运行kill,从而导致错误。

我的xargs不接受-r--no-run-if-empty args,如a related question that doesn't specify POSIX compliance的答案所示。

2 个答案:

答案 0 :(得分:5)

特别针对手头的问题,忽略手边的方法是否真的是一种杀死过程的合适方式:

xargs sh -c '[ $# -gt 0 ] && exec "$0" "$@"' kill

这种方法有xargs启动一个shell,它查看其参数列表的长度(如果只传递kill则为0,因为-c 'script'后面的参数以{{开头} 1}},未包括在$0计数中);如果给出至少一个参数,那个shell只运行给定的命令。

答案 1 :(得分:0)

是的,通常-rxargs选项,请参见:

https://unix.stackexchange.com/questions/521595/if-there-is-empty-stdin-or-whatever-tell-xargs-not-to-care/521599#521599

否则,您可以创建一个bash函数并将其放在xargs之前的管道中:

handle_empty(){
  while read line; do
    if test -z "$line"; then
        echo 'There was an empty line, exiting.' > /dev/stderr
        exit 0;
    fi
    echo "$line"
  done;
}

export -f handle_empty;

并像这样使用它:

docker volume ls -qf dangling=true | handle_empty | xargs docker volume rm 

有关更多信息,请参见: https://gist.github.com/ORESoftware/bb8f97354ff38ee4a0a1dd1589af571a