删除前杀死用户的过程

时间:2014-11-30 02:41:36

标签: bash

我试图在我的脚本中添加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;是我的问题。

2 个答案:

答案 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填充脚本。