私は、ユーザーがログインしたときにそのメニューから再起動オプションを選択できるようにユーザーメニューを開発しています。誰もログインせずにシステムを再起動することがオプションの1つだと思います。
ログインした人がいるかどうかを検索したいです。私はこれが良いスタートになると思います。
# 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」にログインしていて、開いている端末がないことをシミュレートするために、これら2つの変数を手動で設定する場合:
$ num_usr=1
$ num_pts=0
$ if [ $num_pts -eq 0 ] && [ $num_usr -eq 1 ]; then echo "OK to logout";fi
OK to logout
1つの方法を示すために圧縮することができます。
答え2
次のようにしてみてください。
USERS=$(who | wc -l)
if [ $USERS = 0 ]
then
reboot
fi
改行回数を計算するには、printを使用してくださいwc -l
。逆に、このオプションを使用しないと、改行、wc
単語、バイト数が印刷されます。