Encontre tty não utilizado no shell como o bash?

0

Existe uma maneira genérica de encontrar tty não utilizado nos shells como bash ?

O seguinte parece funcionar, mas suponho que deve haver uma maneira melhor?

$ used=$({ find /proc/{0..9}*/fd/0 -printf '%l$\n' | grep tty;} 2> /dev/null)
$ unused=$(find /dev/ -name 'tty*' | grep -ve "$used")
    
por NarūnasK 08.11.2017 / 11:54

1 resposta

1

Supondo que você quer dizer terminais virtuais do Linux, existe o VT_OPENQRY ioctl() para obter o terminal virtual gratuito primeiro (como usado por openvt , por exemplo), mas você precisaria de um arquivo descritor para um dispositivo de console para isso já. Alternativamente, você poderia fazer (como root):

comm -23 <(printf '%s\n' /dev/tty[1-9]*) \
         <(lsof -Fn /dev/tty[1-9]* | sed -n 's/^n//p' | sort -u)

Que você poderia generalizar para outros tipos de dispositivos tty, como os seriais.

Isso seria mais robusto na medida em que consideraria apenas esses caminhos de dispositivos e não teria problemas com nomes de arquivos com operadores regexp ou novas linhas, mas como em sua abordagem, isso não funcionaria corretamente se os dispositivos tty fossem abertos por qualquer outro caminho que os /dev/ttyxx .

Outra abordagem seria confiar nos números dos dispositivos em vez de no caminho canônico .

Com o GNU stat :

find -L /proc/[1-9]*/fd/. ! -name . -prune -type c -exec  stat -Lc '%t %T' {} + |
  awk '$1 == "4" {seen[$2]}
       END {
         for (i=1; i<=63; i++)
           if (!(sprintf("%x", i) in seen))
             print "/dev/tty" i
       }'
    
por 08.11.2017 / 12:03

Tags