検索を完了し、ログインしている人がいないことを確認したら、システムを再起動したいと思います。

検索を完了し、ログインしている人がいないことを確認したら、システムを再起動したいと思います。

私は、ユーザーがログインしたときにそのメニューから再起動オプションを選択できるようにユーザーメニューを開発しています。誰もログインせずにシステムを再起動することがオプションの1つだと思います。

ログインした人がいるかどうかを検索したいです。私はこれが良いスタートになると思います。

# who | wc 

答えがユーザー0の場合は、システムを再起動したいと思います。メモ:ユーザーがメニューを使用してログインしたためではないことを知っています。

メニューにアクセスするユーザー以外に、他のユーザーがログインしていないかどうかはどうすればわかりますか?

ベストアンサー1

これがあなたが探しているようです。問題は、メニューにアクセスしたユーザーが常に1人以上ログインしていて、ユーザー数が1の時間を探していることです。

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

これは出力を取得し、whoユーザー名の最初の列のみを削除し、一意に並べ替えてカウントを計算します。

しかし、私が見ると、状況はそれより少し複雑なようです。たとえば、このように状況を見ると、ユーザーにログインしたSSHセッションがあるかどうかは無視されます。したがって、上記の出力がデバイスwhoのみであることを指定するのか、それともどのような行があるのか​​を確認したい場合があります。:0pts/#

はい

# 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つの方法を示すために圧縮することができます。

おすすめ記事