저는 사용자가 로그인할 때 해당 메뉴에서 재부팅 옵션을 선택할 수 있도록 사용자 메뉴를 개발 중입니다. 아무도 로그인하지 않고 시스템을 재부팅하는 것이 옵션 중 하나였으면 좋겠습니다.
로그인한 사람이 있는지 검색하고 싶습니다. 나는 이것이 좋은 시작이 될 것이라고 생각합니다.
# who | wc
대답이 사용자 0이면 시스템을 재부팅하고 싶습니다.노트:사용자가 메뉴를 사용하여 로그인했기 때문이 아니라는 것을 알고 있습니다.
메뉴에 액세스하는 사용자 외에 다른 사용자가 로그인되어 있지 않은지 어떻게 알 수 있나요?
답변1
이것이 당신이 찾고있는 것 같습니다. 문제는 메뉴에 접속한 사용자가 항상 1명 이상 로그인되어 있어서 사용자 수가 1인 시간을 찾고 있다는 점입니다.
$ who | awk '{print $1}' | sort -u | wc -l
1
이는 출력을 가져 who
와서 사용자 이름인 첫 번째 열만 제거한 다음 고유하게 정렬하고 개수를 계산합니다.
하지만 제가 보기에는 상황이 그것보다 조금 더 복잡한 것 같습니다. 예를 들어, 이런 방식으로 상황을 보면 사용자에게 로그인된 SSH 세션이 있는지 여부가 무시됩니다. 따라서 위의 출력이 장치 who
일 뿐이라고 지정하는지 , 아니면 어떤 종류의 줄 이 있는지 확인하고 싶을 수도 있습니다 .:0
pts/#
예
# represents the login for the user's desktop on display :0
saml :0 2014-12-01 01:56 (:0)
# represents user's terminals or SSH connections
saml pts/0 2014-12-01 01:57 (:0)
노트:pts/0
이 줄이 ":0"과 관련된 표시를 어떻게 표시하는지 확인하세요 .
따라서 다음과 같은 것이 더 적절해 보입니다.
num_pts=$(who | grep 'pts/' | wc -l)
num_usr=$(who | awk '{print $1}' | sort -u | wc -l)
if [ $num_pts -eq 0 ] && [ $num_usr -eq 1 ]; then echo "OK to logout";fi
예
다음은 2개의 계정에 로그인한 상태에서 실행되는 시뮬레이션입니다.
$ who
saml :0 2014-12-01 01:56 (:0)
saml pts/0 2014-12-01 01:57 (:0)
saml pts/1 2014-12-01 02:13 (:0)
saml pts/2 2014-12-03 04:22 (:0)
saml pts/3 2014-12-05 08:14 (:0)
samtest pts/4 2014-12-05 08:14 (localhost)
명령을 수동으로 실행하면 다음과 같은 결과가 생성됩니다.
$ echo $num_usr
2
$ echo $num_pts
5
$ if [ $num_pts -eq 0 ] && [ $num_usr -eq 1 ]; then echo "OK to logout";fi
$
그러나 ":0"에 로그인되어 있고 열려 있는 터미널이 없는 것을 시뮬레이션하기 위해 이 두 변수를 수동으로 설정하는 경우:
$ num_usr=1
$ num_pts=0
$ if [ $num_pts -eq 0 ] && [ $num_usr -eq 1 ]; then echo "OK to logout";fi
OK to logout
한 가지 방법을 보여주기 위해 압축할 수 있습니다.
답변2
다음과 같이 시도해 보세요.
USERS=$(who | wc -l)
if [ $USERS = 0 ]
then
reboot
fi
개행 횟수를 계산하려면 print를 사용하세요 wc -l
. 반대로 이 옵션을 사용하지 않으면 wc
줄 바꿈, 단어 및 바이트 수가 인쇄됩니다.