我试图在我的脚本中添加if else语句,如果正在删除某个用户,它应该会自动检查是否有任何进程正在运行任何进程,它应该能够杀死所有这些并且然后删除用户。
if ps -u $name
then
sudo pkill -u $name
sudo userdel $name -r -f
echo "The user - $name - has been deleted!"
done < "$fname" # double-quote fname
else
sudo userdel $name -r -f
echo "The user - $name - has been deleted!"
done < "$fname" # double-quote fname
fi
我知道我未能将ps命令付诸实践,我知道如何列出用户进程并将其全部删除,但未能自动将其放入脚本中以检查进程是否正在运行,然后执行此操作这个..&#39;如果用户运行的进程&#39;是我的问题。
答案 0 :(得分:1)
man ps
提到U
标记为ps
以按有效用户ID进行过滤。 -o
定义输出,因此您只需获取进程ID即可。由于ps
还会将“PID”打印为列标题,因此您需要丢弃ps
输出的第一行。
for pid in `ps U "$name" -o pid | head -n -1`
do
sudo kill -KILL $pid
done
应该这样做。
答案 1 :(得分:0)
您可以将用户PID
的所有正在运行的$name
读入数组,而不是循环。测试数组中是否有任何内容,如果是,则在不循环的情况下终止所有过程。这只是解决问题的另一种方法。例如:
!#/bin/bash
uprocs=( $(pgrep -u $name ) ) # fill array with PIDs owned by $name
[ "${#uprocs[@]}" -gt 0 ] && # if procs exist, kill them all
sudo kill "${uprocs[@]}"
sudo userdel $name -r -f # delete the user
unset uprocs # unset array
如果你想使用循环,你也可以这样做:
for i in ${uprocs[@]}; do
sudo kill $i
done
此外,您应该放弃在脚本中放置sudo
(有时它是正确的),但通常,如果您使用脚本管理系统,则应该以root身份运行脚本。通过:
sudo ./scriptname.sh
或使用super user
命令:
su -c ./scriptname.sh
这样,脚本就可以使用UID=0
运行,并且您不必在脚本中sudo
之前的所有命令之前。无论哪种方式都有优点/缺点,但通常您希望避免使用sudo foo
填充脚本。