
Ich muss wissen, wie ich in Linux Redhat 6 für einen angemeldeten Benutzer alle Prozesse außer dem ersten beenden kann.
Beispielsweise AZain
ist ein Benutzer mehrmals von verschiedenen Computern aus angemeldet, sodass ich nur den ersten Prozess zulassen und alle anderen für diesen Benutzer beenden muss:
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)
Bearbeiten: Ich versuche dies, da ich eine Anwendung habe, die Lizenzen für Benutzer verbraucht. Jede neue Sitzung für denselben Benutzer würde also mehr Lizenzen verbrauchen. Wenn ich neue Anmeldungen für denselben Benutzer verhindern könnte, wäre das großartig.
Antwort1
Das ist ein KlassikerXY-Problem- Sie versuchen, die Anzahl der Instanzen lizenzierter Software zu begrenzen, die pro Benutzer ausgeführt werden können, konzentrieren sich jedoch auf die Begrenzung der Shell-Anmeldungen. Dies ist das falsche Problem.
Eine bessere Lösung ist:
Benennen Sie das Programm um, z. B. von
/usr/local/bin/foo
in/usr/local/bin/foo.real
Schreiben Sie ein Wrapper-Skript mit demselben Namen und Pfad wie das Originalprogramm (z. B.
/usr/local/bin/foo
), um zu prüfen, ob der Benutzer es bereits ausführt.Wenn ja, beenden Sie das Programm mit einer entsprechenden Fehlermeldung. Wenn nicht, führen Sie das Originalprogramm aus (
/usr/local/bin/foo.real
)
Ein ganz einfaches Beispiel:
#! /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
Hinweis: Dies funktioniert für gut erzogene Benutzer, die das Lizenzproblem verstehen und kein Problem damit haben, die Regeln einzuhalten. Es wird einen hinterhältigen Benutzer nicht davon abhalten, selbst zu arbeiten . Sie können hinterhältige, aber nicht sehr schlaue Benutzer stoppen, indem Sie zu oder foo.real
hinzufügen .alias foo.real=foo
/etc/profile
/etc/bash.bashrc
Sie könnten einen Root-Cron-Job ausführen, der Instanzen erkennt, die foo.real
ausgeführt werden und bei denen kein Shell-Skript foo
als übergeordneter Prozess aufgerufen wurde. Der Cron-Job könnte solche Instanzen beenden und/oder Ihnen eine Warnung per E-Mail senden (um Spam zu vermeiden, behalten Sie die Prozess-IDs für foo.real im Auge und senden Sie sich nicht mehrere Warnungen über dieselbe PID per E-Mail).
Wenn Ihre lizenzierte Software mit einer Art Lizenzmanager geliefert wird, prüfen Sie übrigens in der Dokumentation, ob die Anzahl der Instanzen pro Benutzer beschränkt werden kann.