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