
Мне нужно знать, как завершить все процессы вошедшего в систему пользователя, кроме первого, в 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
.
Вы можете запустить задание root cron, которое обнаружит экземпляры, foo.real
запущенные без скрипта оболочки, называемого foo
родительским процессом. Задание cron может завершить любые такие экземпляры и/или отправить вам предупреждение (чтобы избежать спама, отслеживайте идентификаторы процессов для foo.real и не отправляйте себе несколько предупреждений об одном и том же PID).
Кстати, если ваше лицензионное программное обеспечение поставляется с каким-либо менеджером лицензий, проверьте его документацию, чтобы узнать, может ли он ограничить количество экземпляров для одного пользователя.