2017-06-23 7 views
1

J'ai défini une fonction interactive appelée pk dans mon script shell pour tuer des programmes, tels que pk emacs pour tuer des programmes emacs, mais si plusieurs instances sont en cours d'exécution, alors vous devez choisir le pid pour tuer ou les tuer tous.Comment afficher le titre de la fenêtre des applications GUI dans le terminal sous Linux

Cela arrive de temps en temps lorsque l'un de mes Emacs se fige depuis mes CentOS dans mon entreprise est vieux, mais dans ma fonction de script pk, j'utiliser ps pour filtrer les commandes et leurs PIDs, AFAIK ps dit pas de titre de la fenêtre dans ce cas, il ne fait qu'imprimer un ou plusieurs "/ usr/bin/emacs", sans plus de détails, et je ne sais pas quel PID gèle ou pas de réponse que je vais tuer.

Je sais que je peux utiliser des outils système comme System Activity (KDE) pour vérifier le titre de la fenêtre et de tuer le programme, mais je veux tuer le programme dans le terminal en utilisant la fonction pk, donc est-il un outil comme ps mais montrant « Fenêtre- title + command + pid "donc je peux utiliser dans mon script pour tuer ce programme. Puisque si vous ouvrez un fichier en utilisant vim ou emacs depuis le terminal, ps avec les options montrera le fichier qu'il édite, donc je connais les détails du PID et je sais lequel tuer, donc ici, le titre de la fenêtre est comme le titre de la fenêtre dans System Activity. Bien sûr, si obtenir le titre Widow est un mauvais moyen, si quelqu'un sait comment tuer l'une des multiples instances du même programme, comme je l'ai dit, les réponses seraient les bienvenues.

Répondre

1

Je viens de trouver une autre solution que je peux utiliser dans ma fonction pk pour tuer les emacs congelés avec la ligne suivante:

kill -SIGUSR2 (xprop | grep -i pid | grep -Po "[0-9]+") 

La partie (xprop...) renverra le PID lorsque vous cliquez sur un programme d'interface graphique en utilisant votre souris .

Si quelqu'un est intéressant dans ma fonction pk, ici il est (NOTE que j'utilise coquille de poisson, c'est donc fonction de script de poisson):

function pk --description 'kill processes containg a pattern' 
    set done 1 
    set result (psg $argv[1] | wc -l) 
    if test $result = 0 
     echo "No '$argv[1]' process is running!" 
    else if test $result = 1 
     psg $argv[1] | awk '{print $2}' | xargs kill -9 
     if test $status = 123 # Operation not permitted 
      read -p 'echo "Use sudo to kill it? [y/N]: "' -l arg 
      if test "$arg" = "y" 
       psg $argv[1] | awk '{print $2}' | xargs sudo kill -9 
      end 
     end 
    else 
     psg $argv[1] 
     while test $done = 1 
      read -p 'echo "Kill all of them or specific PID? [y/N/pid]: "' -l arg 
      if test "$arg" = "y" 
       psg $argv[1] | awk '{print $2}' | xargs kill -9 
       if test $status -eq 123 # Operation not permitted 
        read -p 'echo "Use sudo to kill them all? [y/N]: "' -l arg2 
        if test "$arg2" = "y" 
         psg $argv[1] | awk '{print $2}' | xargs sudo kill -9 
        end 
       end 
       set done 0 
      else if test $arg -a "$arg" != "y" -a "$arg" != "n" 
       # the fist cond in test means you typed something, RET will not pass 
       if test (psg $argv[1] | awk '{print $2}' | grep -i $arg) 
        kill -9 $arg #2>/dev/null 
        if test $status -eq 1 # kill failed 
         read -p 'echo "Use sudo to kill it? [y/N]: "' -l arg2 
         if test "$arg2" = "y" 
          sudo kill -9 $arg 
         end 
        end 
        echo -e "Continue...\n" 
        usleep 100000 
        psg $argv[1] 
       else if test "$arg" = "p" 
        # This may be used for frozen emacs specifically, -usr2 or -SIGUSR2 
        # will turn on `toggle-debug-on-quit`, turn it off once emacs is alive again 
        # Test on next frozen Emacs 
        kill -SIGUSR2 (xprop | grep -i pid | grep -Po "[0-9]+") 
        # kill -usr2 (xprop | grep -i pid | grep -Po "[0-9]+") 
        return 
       else 
        echo "PID '$arg[1]' is not in the list!" 
        echo 
       end 
       set done 1 
      else 
       # RET goes here, means `quit` like C-c 
       set done 0 
      end 
     end 
    end 
end