So beenden Sie alle Sitzungen eines Linux-Benutzers außer der ersten und beschränken die Benutzer auf eine Anmeldesitzung

So beenden Sie alle Sitzungen eines Linux-Benutzers außer der ersten und beschränken die Benutzer auf eine Anmeldesitzung

Ich muss wissen, wie ich in Linux Redhat 6 für einen angemeldeten Benutzer alle Prozesse außer dem ersten beenden kann.

Beispielsweise AZainist 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/fooin/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.realhinzufügen .alias foo.real=foo/etc/profile/etc/bash.bashrc

Sie könnten einen Root-Cron-Job ausführen, der Instanzen erkennt, die foo.realausgeführt werden und bei denen kein Shell-Skript fooals ü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.

verwandte Informationen