Eu quero reiniciar o sistema uma vez que uma pesquisa tenha sido feita para ver que ninguém está logado

3

Estou trabalhando em um menu de usuário para que, quando um usuário fizer o login, todos eles recebam esse menu; neste menu é uma seleção de opção de reinicialização. Eu quero uma das opções para reiniciar o sistema, se ninguém estiver logado.

Eu quero que uma pesquisa seja realizada para ver se alguém fez login. Acho que seria um bom começo:

# who | wc 

se a resposta fosse 0 usuários, eu gostaria que o sistema fosse reinicializado. OBSERVAÇÃO: Eu sei que não será porque o usuário está logado usando o menu.

Como posso saber se não há outro usuário logado além daquele acessando o menu?

    
por user2995836 05.12.2014 / 11:49

2 respostas

2

Isso parece o que você está procurando. A questão, como eu vejo, é que sempre haverá pelo menos um usuário que está logado, ou seja, aquele que acessa o menu, então você está procurando quando o número de usuários é 1.

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

Isso pega a saída de who e corta apenas a primeira coluna, ou seja, os nomes de usuários, e então os classifica de forma única e depois os conta.

Mas, IMO, é um pouco mais complicado do que isso. Observar a situação dessa maneira é ignorar se esse usuário tiver alguma sessão SSH registrada, por exemplo. Então você provavelmente quer verificar se a saída acima de who especifica que são apenas :0 dispositivos ou se há pts/# tipos de linhas.

Exemplos

# 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)

OBSERVAÇÃO: Observe como a linha pts/0 mostra a qual exibição está associada, ": 0".

Então, algo assim parece mais apropriado:

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

Exemplo

Aqui está uma simulação em que eu tenho duas contas conectadas:

$ 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)

Executar os comandos manualmente produz isso:

$ echo $num_usr
2
$ echo $num_pts
5
$ if [ $num_pts -eq 0 ] && [ $num_usr -eq 1 ]; then echo "OK to logout";fi
$

Se eu definir manualmente as 2 variáveis, no entanto, para simular que estou logado em ": 0" e não tenho nenhum terminal aberto:

$ num_usr=1
$ num_pts=0
$ if [ $num_pts -eq 0 ] && [ $num_usr -eq 1 ]; then echo "OK to logout";fi
OK to logout

Isso pode ser condensado e serve apenas para mostrar uma abordagem.

    
por 05.12.2014 / 14:26
2

Tente algo assim:

USERS=$(who | wc -l)
if [ $USERS = 0 ]
then
    reboot
fi

Usando wc -l imprima as contagens de nova linha. Em vez disso, se você não usar essa opção, wc imprimirá as contagens de nova linha, palavra e byte.

    
por 05.12.2014 / 11:56

Tags