【发布时间】:2023-03-17 05:02:01
【问题描述】:
我不太擅长 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 参数,正如对 a related question that doesn't specify POSIX compliance 的回答中所建议的那样。
【问题讨论】:
-
顺便说一句——如果你有
pkill,你最好在单个命令中使用它来执行此操作,而不是尝试通过巨大的管道过滤ps输出。此外,awk可以自己完成grep和cut的工作,因此即使您要坚持使用管道,也没有理由让它如此复杂。 -
即:
ps auxww | awk '(/XUnit/ && ! /awk/) { print $2 }'。但是,如上所述,最佳做法是根本不使用ps。 -
嗯。阅读
awk的 POSIX 规范, 允许受制于LINE_MAX,通常为 2k。刚刚在那里学到了一些新东西——虽然我很好奇你使用的哪个实现实际上强制了这个限制。 -
@BenjaminW.,是的!我认为 POSIXly 简约的方法是
ps -e -o pid= -o args= | awk '/[X]Unit/{ print $1 }'。如果您担心该限制,可以在 awk 之前抛出cut -c -$(getconf LINE_MAX)。