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.