特定の列のデータ範囲に基づいて行のみを表示するようにコマンドの出力を解析します。

特定の列のデータ範囲に基づいて行のみを表示するようにコマンドの出力を解析します。

似たような投稿にたくさん触れましたが、私が欲しいものを見つけようとしていますが、これは確かに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 &

utempterutmpにエントリを追加するために使用される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

関連情報