我想杀死与特定链匹配的每个进程。这是我的脚本,效果很好:
echo `ps aux | grep verySpecificChain | grep -v grep | /usr/bin/awk '{ print $2 }'` | xargs kill
现在我想通过“su -c”从其他用户执行此脚本:
echo password | su -c "echo `ps aux | grep verySpecificChain | grep -v grep | /usr/bin/awk '{ print $2 }'` | xargs kill" userName;
我的问题是,当grep verySpecificChain
匹配多个进程时,只有第一个元素被传递给xargs kill
:
30598 ==> killed
bash: line 1: 30599: command not found ==> Not killed
bash: line 2: 30600: command not found ==> Not killed
bash: line 3: 30606: command not found ==> Not killed
我真的很想了解为什么有或没有su -c
命令行为改变?
我在 Fedora 20 上运行 GNU bash,版本 4.2.53(1)-release (x86_64-redhat-linux-gnu)。
答案1
只是pkill -f verySpecificChain
答案2
我无法解释你的例子中到底失败了什么(所以我承认这是我这边的某种巫毒编程),但这是一个在我的 bash (Debian) 中有效的修复(几乎 - 见下文*):
- 摆脱里面的
echo
; - 逃脱
$2
。
结果:
echo password | su -c "ps aux | grep verySpecificChain | grep -v grep | /usr/bin/awk '{ print \$2 }' | xargs kill" userName;
*我写了“几乎可以工作”,因为 Debian 不允许我su
在管道中使用来回显密码。我必须在没有首字母的情况下运行它echo
并以交互方式输入密码。我想这在 OP 的 Fedora 中不是问题。