
Linux Redhat 6 で、ログインしているユーザーの最初のプロセスを除くすべてのプロセスを強制終了する方法を知る必要があります。
たとえば、AZain
ユーザーが異なるマシンから複数回ログインしている場合は、最初のプロセスのみを許可し、このユーザーに対して他のすべてのプロセスを停止する必要があります。
who -u
AZain pts/2 2016-06-23 08:34 . 27191 (localhost)
AZain pts/4 2016-06-23 09:01 . 28885 (localhost)
root pts/0 2016-06-23 08:14 . 25962 (10.11.155.23)
AZain pts/1 2016-06-23 08:34 00:27 27169 (10.11.155.23)
AZain pts/3 2016-06-23 09:01 . 28867 (10.11.155.14)
編集: ユーザーのライセンスを消費するアプリケーションがあるため、これを実行しようとしています。そのため、同じユーザーの新しいセッションごとに、より多くのライセンスが消費されます。同じユーザーの新しいログインを防止できれば、非常に便利です。
答え1
これは古典だXY問題- ユーザーごとに実行されるライセンス ソフトウェアのインスタンス数を制限しようとしていますが、シェル ログインの制限に重点を置いています。これは解決すべき問題ではありません。
より良い解決策は次のとおりです。
プログラム名を変更します。例: から
/usr/local/bin/foo
へ/usr/local/bin/foo.real
元のプログラムと同じ名前とパス (例 ) を持つラッパー スクリプトを作成し、
/usr/local/bin/foo
ユーザーがすでに実行しているかどうかを確認します。はいの場合は、適切なエラーメッセージを出して終了します。そうでない場合は、元のプログラムを実行します(
/usr/local/bin/foo.real
)
非常に簡単な例:
#! /bin/sh
if pgrep -u "$USER" foo.real >/dev/null 2>&1 ; then
echo "You are already running foo" >&2
exit 1
else
foo.real
fi
注: これは、ライセンスの問題を理解し、ルールに従うことを気にしない行儀の良いユーザーに対して有効です。 不正なユーザーが自分自身で実行するのを阻止することはできません。またはをfoo.real
追加することで、不正だがあまり賢くないユーザーを阻止できます。alias foo.real=foo
/etc/profile
/etc/bash.bashrc
foo.real
親プロセスとして呼び出されるシェル スクリプトを持たないインスタンスの実行を検出するルート cron ジョブを実行できますfoo
。cron ジョブは、そのようなインスタンスを強制終了したり、警告を電子メールで送信したりできます (スパムメールを避けるには、foo.real のプロセス ID を追跡し、同じ PID に関する警告を複数回自分にメールで送信しないでください)。
ちなみに、ライセンスされたソフトウェアに何らかのライセンス マネージャーが付属している場合は、そのドキュメントをチェックして、ユーザーあたりのインスタンス数を制限できるかどうかを確認してください。