검색을 완료하고 로그인한 사람이 없는 것을 확인한 후 시스템을 다시 시작하고 싶습니다.

검색을 완료하고 로그인한 사람이 없는 것을 확인한 후 시스템을 다시 시작하고 싶습니다.

저는 사용자가 로그인할 때 해당 메뉴에서 재부팅 옵션을 선택할 수 있도록 사용자 메뉴를 개발 중입니다. 아무도 로그인하지 않고 시스템을 재부팅하는 것이 옵션 중 하나였으면 좋겠습니다.

로그인한 사람이 있는지 검색하고 싶습니다. 나는 이것이 좋은 시작이 될 것이라고 생각합니다.

# who | wc 

대답이 사용자 0이면 시스템을 재부팅하고 싶습니다.노트:사용자가 메뉴를 사용하여 로그인했기 때문이 아니라는 것을 알고 있습니다.

메뉴에 액세스하는 사용자 외에 다른 사용자가 로그인되어 있지 않은지 어떻게 알 수 있나요?

답변1

이것이 당신이 찾고있는 것 같습니다. 문제는 메뉴에 접속한 사용자가 항상 1명 이상 로그인되어 있어서 사용자 수가 1인 시간을 찾고 있다는 점입니다.

$ who | awk '{print $1}' | sort -u | wc -l
1

이는 출력을 가져 who와서 사용자 이름인 첫 번째 열만 제거한 다음 고유하게 정렬하고 개수를 계산합니다.

하지만 제가 보기에는 상황이 그것보다 조금 더 복잡한 것 같습니다. 예를 들어, 이런 방식으로 상황을 보면 사용자에게 로그인된 SSH 세션이 있는지 여부가 무시됩니다. 따라서 위의 출력이 장치 who일 뿐이라고 지정하는지 , 아니면 어떤 종류의 줄 이 있는지 확인하고 싶을 수도 있습니다 .:0pts/#

# 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줄 바꿈, 단어 및 바이트 수가 인쇄됩니다.

관련 정보