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
없음 을 감지하는 루트 크론 작업을 실행할 수 있습니다 . foo
크론 작업은 그러한 인스턴스를 종료하거나 이메일을 통해 경고를 보낼 수 있습니다(스팸을 피하려면 foo.real의 프로세스 ID를 추적하고 동일한 PID에 대해 여러 경고를 이메일로 보내지 마십시오).
그런데 라이선스가 부여된 소프트웨어가 일종의 라이선스 관리자와 함께 제공되는 경우 설명서를 확인하여 사용자당 인스턴스 수를 제한할 수 있는지 확인하세요.