Maneira ideal de rastrear a sessão TTY que bloqueia um recurso?

3

Digamos que você tenha muitas shells interativas sendo executadas com o mesmo ID de usuário, como muitas " screen " ou "% _de_cada% (ou ambas)" guias ". Você tentou tmux 'em um dispositivo e percebeu que não era possível, pois uma daquelas sessões de shell teve seu diretório atual alterado lá. Você pode encontrar facilmente o nome TTY e a lista de processos associados (apenas outro unmount ou bash ), mas assumindo que você não quer apenas zsh até ter certeza de que é seguro fazer isso, como você vai encontrar kill / screen "tab" correspondente?

    
por poige 01.07.2016 / 09:01

1 resposta

3

Não tenho certeza se esse é o caminho ideal, mas aqui está "de uma maneira".

Primeiro, identifique qual sessão "screen" ou "tmux" tem o dispositivo aberto:

lsof -R $mountpoint

As poucas coisas que você precisa dessa saída são o PID do processo e seu PPID (suponha que você os atribua a $PID e $PPID respectivamente).

Em seguida, verifique quais processos filhos estão sendo executados sob este PID, isso deve ajudá-lo caso você ssh em outra máquina deste shell, ou você tenha um editor ou alguma outra coisa em execução no momento. Se algo está sendo executado, deve ser fácil encontrar a guia que você precisa com base nos comandos filhos.

pstree -p $PID

Supondo que o comando acima não produza saída, você deve agora verificar qual é o pai desse shell.

ps -f $PPID

Se isso for tudo, menos SCREEN ou tmux , você poderá descobrir facilmente.

No caso de ser SCREEN e você tiver vários, será possível descobrir qual deles, examinando os processos filhos do SCREEN necessário.

pstree -p $PPID

Se ainda houver vários, você poderá abrir uma nova guia em cada SCREEN e continuar executando novamente o pstree -p $PPID até descobrir qual deles é. Depois disso, você tem que verificar cada guia e de alguma forma descobrir o correto. No shell, você pode verificar o PID do shell se ele corresponder ao $PID do problemático ou a um de seus filhos, conforme produzido por pstree -p $PID acima.

Se for tmux , não é tão fácil como todas as shells estão sob um único tmux. No entanto, algo que você pode fazer com tmux é enviar automaticamente pressionamentos de tecla para todos os painéis abertos. Isso pode fazer algo inesperado se você tiver um editor sendo executado lá, mas provavelmente você sabe que é melhor fazer isso ou não.

for i in $(tmux list-panes -a | awk -F': ' '{print $1}'); do
  tmux send-keys -t $i "[[ \$\$ == $PID ]] && logout" Enter
done
    
por 04.07.2016 / 17:10

Tags