私は、小規模オフィスでローカルコンソール、SSH、およびNoMachine Workstationを介してリモートでさまざまな方法でシステムにログインする複数のユーザーを持つシステム(RHEL 8を実行)を管理しています。新しいカーネルを含むアップデートを実行したり、他の理由でコンピュータを再起動する必要がある場合は、現在ログインしているユーザーがいないことを確認して、ソフトウェアを実行しているユーザーのコンピュータをクラッシュさせないようにしたいと思います。
そのため、現在ログインしているすべてのユーザーを一覧表示するコマンドが必要です。
私はこのトピックについて多くの検索をしてきましたが、この質問に答えるために私が見つけた方法はうまくいかないことが証明されているので、完全に間違っています。
命令しwho
、実行するw
users
いいえリストログインしたすべてのユーザー。この記事を書いている現在の問題のコンピュータには、私を含む3人のユーザーがログインしています。このコマンドはこれら3つのうちの1つだけをリストします(しかし私はそれらの1つではありません)。このコマンドはSSHを介してログインし、端末が開いているユーザーを一覧表示します。他のユーザーはTTYを持っていませんが、複数のGUIアプリケーションが開いていて、彼のXはSSHを介してラップトップに表示されますが、表示されず、私も表示されません(NoMachine経由でグラフィカルログインがあります)。実際にwho -m
実行すると、出力は返されません。これを使用してps -ef
すべてのプロセスを一覧表示し、すべてのユーザーに対して現在実行中のプロセスを見つけることができます。
コマンドlast | grep 'still logged in'
(提案ここ)は上記と同じ不完全なリストを生成します(同じソースから情報を取得します)。
もしそうなら、質問を繰り返すと、ログインしたすべてのユーザー(一般的なメカニズムを介して認証し、現在のユーザーIDで実行されている対話型プロセスを持つユーザー)のリストを取得する究極の方法は何ですか?検索結果なしでこれを実行したいと思いますps
。
編集 - このワークステーションのユーザーはすべてLDAPを介して認証されていますが、これが問題とは関係がないことを確認しました。上記と同じ方法で応答またはwho
ログインusers
したときに表示されないローカルユーザーアカウントを作成しました。
ベストアンサー1
Linuxシステムを再起動する状況を考慮して、多面的なアプローチをとります。
まず、ファイルを作成して将来のログインを無効にします/etc/nologin
。空白のままにするか、次の情報テキストを入力できます。
「サーバーの再起動を準備するために、このシステムへのログインが一時的に無効になっており、再起動が(時刻と日付)に予定されています。(予期終了時間)後に再試行してください。
作業が終わったら/etc/nologinを削除することを忘れないでください!
また、再起動するとクリアされるのでみんなインタラクティブであるかどうかにかかわらず、プロセスはps
ユーザーが所有するプロセスを見つけるために使用されます。これを行うには、これらのプロセスを維持する価値があるかどうかを判断するためにいくつかの手動調査が必要ですが、範囲を狭める必要があります。ここでは、「システム」と「ユーザー」のUIDのカットオフで、/etc/login.defsのUID_MIN値で1000をハードコーディングしました。ユーザーのUIDが1000未満の場合は、その番号を調整する必要があります。
ps -eo pid,uid,args | awk '$2 >= 1000'
もちろん、ps
熱を好きなように調整できます。翻訳されたユーザー名とプロセス開始時間()などを追加することもできます。ただし、UIDとフィールドを互いに同期させるps -eo pid,uid,user,start,args
ように注意してください。ps
awk
一意のユーザー名のリストを取得するには、次のようにします。
ps -eo user,uid | awk 'NR>1 && $2 >= 1000 && ++seen[$2]==1{print $1}'