
似たような投稿にたくさん触れましたが、私が欲しいものを見つけようとしていますが、これは確かにrtfmの例です。私はawkやgrepが何らかの方法で役に立つと思います。正しい方向を指すのに役立ちます。
今後、他のユーザーがその機能を実行できるようにするプロンプトを含むスクリプトを作成する予定ですが、まず自分自身のために作業する基本的なアイデアを得たいと思います。
who -u
現在ログインしているユーザーを表示し、アイドル時間に基づいてユーザーID、アイドル時間、およびPIDを表示する必要があります。
例えば、
01sale1 pts/11 2016-10-05 06:39 00:04 14132 (192.168...)
01sale2 pts/16 2016-10-05 06:40 00:07 17902 (192.168...)
01sale3 pts/14 2016-10-05 06:40 . 17779 (192.168...)
01sale5 pts/25 2016-10-05 06:41 00:04 18339 (192.168...)
誰もがオンラインにアクセスすると、リストが非常に長くなり、特定のソフトウェアのライセンス制限に達するのに問題が発生します。この問題を解決するには、ユーザーを1時間ほどアイドル状態にしておく必要があります。
私が望むのは、who -uを実行して、列6が1時間より古いかどうかに応じて列1、5、6のみを表示して01:**以上が表示されるようにすることです。
最終的には、rootを持たないユーザーが実行できるスクリプトを作成したいと思います。このスクリプトはそれらにこの情報を表示し、アイドルユーザーを終了します。完全自動化したいかどうかはわかりません。
以前のRed Hatでこのアプリケーションを実行しています。
答え1
次のように試すことができます。
who -u | \
awk '$5 ~ /^[0-9][1-9]:.*$|^[1-9][0-9]:.*$/ {printf "%s %s %s\n", $1,$5,$6}'
awk
で始まるパターンと一致します0[1-9] || [1-9][0-9]
。
一致するパターンを試してみてください。起動しない00
あなたがする意思がある場合。
答え2
アイドル時間はttyデバイスの最後のアクセス時間から派生するため、次のことができます。
kill_idle() (
sig=$1
old_ttys=$(find /dev/pts -type c ! -name ptmx -amin +60 -printf %p,)
[ "$#" -eq 0 ] || pkill "-$sig" -t "$old_ttys"
)
kill_idle HUP; sleep 3; kill_idle KILL
これらの非アクティブttyによって制御されるすべてのプロセスを終了します。
これで、@rudimeterが正しく指摘したように、デバイスは/dev/pts
常にユーザー端末セッションでのみ使用されるわけではなく、他の目的のために擬似端末を使用するプロセス(たとえば、他の端末ルールやptyを使用するプロセス)が終了する可能性がexpect
あります。socat
端末エミュレータ、getty、screen、sshdなどのものは、生成した擬似端末をデータベースに登録し、utmp
それがwho -u
照会されます。
得るために怠惰who -u
代わりに、次のことができます。
old_ttys=$(
who -u | awk '$5 != "." && $5 !~ /^00/ {printf "%s,", $2}'
)
who -u
ただし、ptyの登録に使用されたシステムからの出力が変調される可能性があります。utempter
たとえば、ここではsocat
以下を使用してptyを作成します。
name=$':0)\nnobody pts/2 2016-10-05 00:00 old 123 (:0' socat pty \
system:'/usr/lib/x86_64-linux-gnu/utempter/utempter add \"$name\"; sleep infinity',nofork &
utempter
utmpにエントリを追加するために使用されるsgidコマンド。標準入力は次を指す必要がptmx
あり、そのスレーブポイントは呼び出し元が所有する必要があるため、ある程度入力を検証しますが、検証はしません。所有者大地。ここでは所有者フィールドには改行文字が含まれており、出力に偽のアイテムを作成しますwho -u
。
nobody pts/2 2016-10-05 00:00 old 123 (:0)
つまり、いつでもプロセスを終了できます。
アイドル端末のみ一覧表示:
who -u | awk '$5 != "." && $5 !~ /^00/'
または、ユーザー、アイドル時間、端末制御プロセスのpidを一覧表示します。
who -u | awk '
$5 != "." && $5 !~ /^00/ {printf "%-16s %6s %d\n", $1, $5, $6}'
このw
コマンドはより有用な出力を提供する可能性があります(また、上記の脆弱性に対して脆弱ではありません)。
$ w -sf | awk 'NR > 2 && $3 !~ /[0-9]s?$/'
stephane tty7 50days /usr/bin/lxsession -s LXDE -e LXDE
stephane pts/1 3:07m /bin/zsh
stephane pts/3 1:25m elinks