我对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的答案所示。
答案 0 :(得分:5)
特别针对手头的问题,忽略手边的方法是否真的是一种杀死过程的合适方式:
xargs sh -c '[ $# -gt 0 ] && exec "$0" "$@"' kill
这种方法有xargs
启动一个shell,它查看其参数列表的长度(如果只传递kill
则为0,因为-c 'script'
后面的参数以{{开头} 1}},未包括在$0
计数中);如果给出至少一个参数,那个shell只运行给定的命令。
答案 1 :(得分:0)
是的,通常-r
有xargs
选项,请参见:
否则,您可以创建一个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