потому что `...` эквивалентен $ (...), который является подоболочкой. изменение переменных в подоболочке теряется при закрытии подоболочки.
Это сгенерирует список процессов с заданным именем и список процессов с заданным именем, запущенных от имени root, затем запустите comm
, чтобы найти процессы в первом списке, которых нет во втором списке, затем убейте их.
#!/bin/ksh
if test $# != 1
then
echo usage: "$0" processname
exit 1
fi
pname="$1"
kill $(comm -23 <(pgrep "$pname"|sort -n) <(pgrep -u root "$pname"|sort -n))
Я использую SUSE, но предполагаю, что он работает аналогично в Solaris.
Чтобы убить процесс по его идентификатору пользователя. Вы можете выполнить следующие действия:
#pkill -U
Если вы просто хотите чтобы проверить, какие процессы выполняются для конкретного пользователя перед тем, как убить его процессы, вы можете использовать:
pgrep -U
#pkill -U
и так далее.
Я знаю, что вы избегаете sed, awk, grep. Но проще написать сценарий, чем вводить каждое имя пользователя. Вот пример. Пожалуйста, проверьте sanbox перед запуском в производство.
ps -aef |grep -v UID |grep -v root |awk '{print $1}'
|sort -u |while read name
do
echo "Killing process for user $name"
pkill -U $name
done