Screen: Retomando a tela mais recente? Fazendo a seleção mais fácil?

5

Eu tenho algumas perguntas sobre a tela: Quando digito screen -r , obtenho o seguinte:

There are several suitable screens on:
    25154.tracks    (Detached)
    29278.mywork    (Detached)
    29138.mywork    (Detached)
    30915.mywork    (Detached)
    20065.mywork    (Detached)
Type "screen [-d] -r [pid.]tty.host" to resume one of them.

Não tenho certeza, mas acredito que a maioria dessas telas é antiga, já que não uso a tela há algum tempo e, acidentalmente, me separei de uma. Com isso, minhas perguntas são:

  • Existe uma maneira de retomar a tela do mais recente desanexado?
  • Como faço para "excluir" sessões de tela mais antigas?
  • É possível exibir a data e o número de telas em cada sessão?
  • Existe uma maneira de associar temporariamente aliases às telas listadas por screen -r para facilitar sua escolha? Por exemplo, seria ótimo se screen -r listasse as telas da seguinte forma:
There are several suitable screens on:
[1] 25154.tracks  (Detached)
[2] 29278.mywork  (Detached)
[3] 29138.mywork  (Detached)
[4] 30915.mywork  (Detached)
[5] 20065.mywork  (Detached)
Choose  one to resume:

E então eu poderia digitar 1,2,3,4 ou 5 sem ter que digitar o pid completo da tela que desejo retomar. Existe alguma coisa que funcione?

    
por Amelio Vazquez-Reina 18.10.2011 / 00:47

2 respostas

3

Aqui está um script que deve funcionar para você.

#!/bin/bash

function chooser {

    echo
    echo "I found the following screen sessions: "
    echo

    pcount=0

    # 
    # find the session dir
    #
    sessdir=$( screen -ls | egrep 'Socket' | awk '{print $NF}' | sed -e 's/\.$//' )

    #
    # enumerate existing sessions, and add them to the plist() array.
    #
    for screen in $( find $sessdir -type p ); do
            pcount=$((pcount+1))
            pname=$( basename $screen )
            pdate=$( ls -latr $screen | awk '{print "( "$6" "$7" "$8" )"}')
            plist[$pcount]=${pname}
            echo "  [$pcount]       $pname   $pdate"
    done

    echo
    echo -n "Please select a session to reconnect to: "
    read choice

    # 
    # if the selected choice doesn't exist, recycle the chooser.
    #
    if [ -z ${plist[$choice]} ]; then
            echo
            echo "Your choice [$choice] is invalid.  Please try again."
            echo
            sleep 1
            chooser
    else
            screen -r -d ${plist[$choice]}
    fi

}

#
# the chooser function does all the work
#
chooser

Eu não fiz distinção entre as sessões que estão atualmente anexadas ou desanexadas, então você pode ter que fazer isso sozinho se for importante para você.

    
por 18.10.2011 / 02:09
2

A primeira coisa a fazer é determinar a localização do diretório da sessão. Você pode obter isso da saída de screen -ls .

# session directory
sessdir='screen -ls | sed -ne 's/.*Sockets* in \(.*\)\.$//p''
# display age of sessions:
ls -l $sessdir
# newest session
newest='ls -1t $sessdir | head -1'
# Kill all sessions but newest
ls -1t $sessdir| sed 1d | while read sess; do screen -m -S $sess -X quit; done

A sessão "mais recente" é a mais recente criada; Não acredito que haja informações sobre quando uma sessão foi desconectada.

Você certamente pode criar um wrapper para selecionar em uma lista e iniciar essa sessão, mas não poderá recuperar informações de uma sessão existente (a saída vai para a sessão, não para a saída do programa de chamada.

    
por 18.10.2011 / 02:33

Tags