我不太擅长 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 的回答所建议的.
最佳答案
具体解决手头的问题,忽略手头的方法实际上是否是杀死进程的合适方法:
xargs sh -c '[ $# -gt 0 ] && exec "$0" "$@"' kill
这种方法有
xargs
启动一个 shell,它查看其参数列表的长度(如果只有 kill
被传递,它将为 0,因为 -c 'script'
后面的参数以 $0
开头,不包括在 $#
计数中);如果至少给出了一个参数,该 shell 只会运行给出的命令。
关于shell - 防止 POSIX xargs 尝试运行空命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34440312/