Я хочу убить все процессы, которые соответствуют определенной цепочке. Вот мой скрипт, который работает довольно хорошо:
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
командой или без нее поведение меняется?
Я использую GNU bash версии 4.2.53(1)-release (x86_64-redhat-linux-gnu) на Fedora 20.
решение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
и ввести пароль интерактивно. Думаю, в Fedora OP это не проблема.