我想在完成搜索后发现没有人登录后重新启动系统

我想在完成搜索后发现没有人登录后重新启动系统

我正在开发一个用户菜单,以便当用户登录时他们得到的就是这个菜单;该菜单上有一个重新启动选项的选择。我希望其中一个选项是在没有人登录的情况下重新启动系统。

我想要进行搜索以查看是否有人登录。我认为这将是一个好的开始:

# who | wc 

如果答案是 0 个用户,我希望系统重新启动。笔记:我知道这不会是因为用户是使用菜单登录的。

我怎样才能知道除了访问菜单的用户之外是否没有其他用户登录?

答案1

这似乎就是您正在寻找的。我看到的问题是,总会有至少 1 个用户登录,即访问菜单的用户,因此您要查找用户数量为 1 的时间。

$ who | awk '{print $1}' | sort -u | wc -l
1

这会获取输出who并仅删除第一列,即用户名,然后对其进行唯一排序,然后对其进行计数。

但在我看来,情况比这要复杂一些。例如,以这种方式查看情况会忽略该用户是否有任何登录的 SSH 会话。因此,您可能想检查上面的输出是否who指定它只是:0设备,或者是否存在任何pts/#类型的线路。

例子

# represents the login for the user's desktop on display :0
saml     :0           2014-12-01 01:56 (:0)

# represents user's terminals or SSH connections
saml     pts/0        2014-12-01 01:57 (:0)

笔记:请注意该行如何pts/0显示与“:0”关联的显示。

所以这样的事情似乎更合适:

num_pts=$(who | grep 'pts/' | wc -l)
num_usr=$(who | awk '{print $1}' | sort -u | wc -l)

if [ $num_pts -eq 0 ] && [ $num_usr -eq 1 ]; then echo "OK to logout";fi

例子

这是我登录了 2 个帐户的模拟运行:

$ who
saml     :0           2014-12-01 01:56 (:0)
saml     pts/0        2014-12-01 01:57 (:0)
saml     pts/1        2014-12-01 02:13 (:0)
saml     pts/2        2014-12-03 04:22 (:0)
saml     pts/3        2014-12-05 08:14 (:0)
samtest  pts/4        2014-12-05 08:14 (localhost)

手动运行命令会产生以下结果:

$ echo $num_usr
2
$ echo $num_pts
5
$ if [ $num_pts -eq 0 ] && [ $num_usr -eq 1 ]; then echo "OK to logout";fi
$

但是,如果我手动设置这两个变量来模拟我已登录“:0”并且没有打开终端:

$ num_usr=1
$ num_pts=0
$ if [ $num_pts -eq 0 ] && [ $num_usr -eq 1 ]; then echo "OK to logout";fi
OK to logout

这可以压缩,只是为了向您展示一种方法。

答案2

尝试这样的事情:

USERS=$(who | wc -l)
if [ $USERS = 0 ]
then
    reboot
fi

使用wc -lprint 来计算换行符。相反,如果不使用此选项,wc则会打印换行符、单词和字节计数。

相关内容