Lista Process med Fönstertitel?

Här diskuterar vi skal, kommandon och klassiska linuxverktyg.
Användarvisningsbild
cupe
Inlägg: 650
Blev medlem: 05 jun 2008, 07:10
OS: Ubuntu
Utgåva: 12.04 Precise Pangolin LTS

Lista Process med Fönstertitel?

Inlägg av cupe »

Hur gör man för att lista processor med fönstertitel? Det vill säga, ungefär;

Kod: Markera allt

ps | grep firefox

Ubuntu Sverige * Skapa en ny tråd * Mozilla Firefox
Problemet är dock att jag har inte fått till det med flertalet flaggor i ps, och har inte hittat något annat sätt heller. Det absolut bästa hade varit att endast lista fönstertitel, och ingenting annat.

Kod: Markera allt

cupe ~ $       ps -e | grep firefox
16733 ?        00:03:19 firefox
cupe ~ $       ps -ely | grep firefox
S  1000 16733 16281  2  80   0 90404 159743 -     ?        00:03:19 firefox
cupe ~ $       ps -eF | grep firefox
cupe     16733 16281  2 159743 90404  1 08:37 ?        00:03:19 /usr/lib/firefox-3.0/firefox
cupe     23679 23658  0  1295   868   0 10:44 pts/9    00:00:00 grep firefox
Ger inget vidare resultat. Idéer?
Användarvisningsbild
gasol
Inlägg: 405
Blev medlem: 27 jul 2007, 14:57
Kontakt:

Re: Lista Process med Fönstertitel?

Inlägg av gasol »

Tja, för att få ut fönster titlarna så måste du nog använda xprop

Kod: Markera allt

xprop -root | grep _NET_CLIENT_LIST\(WINDOW\):
Ger dig nåt i stil med detta:

Kod: Markera allt

NET_CLIENT_LIST(WINDOW): window id # 0xa00057, 0x1a00051, 0x2800008, 0xe01f16, 0xe00004, 0xa1cc7e, 0xc000ca, 0x2600008
Där detta är X systemets ID nummer för fönsterna.

Kod: Markera allt

xprop -id 0xa00057
Ger detta resultat:

Kod: Markera allt

_NET_WM_USER_TIME(CARDINAL) = 83575919
XKLAVIER_STATE(INTEGER) = 0, 0
__E_WINDOW_MAPPED(CARDINAL) = 0
WM_STATE(WM_STATE):
                window state: Withdrawn
                icon window: 0x0
_E_FRAME_SIZE(CARDINAL) = 4, 4, 27, 4
_NET_FRAME_EXTENTS(CARDINAL) = 4, 4, 27, 4
__E_WINDOW_DESK(CARDINAL) = 0, 0
__E_WINDOW_ZONE(CARDINAL) = 0
__E_WINDOW_CONTAINER(CARDINAL) = 0
__E_WINDOW_MANAGED(CARDINAL) = 1
WM_HINTS(WM_HINTS):
                Client accepts input or input focus: True
                Initial state is Normal State.
                bitmap id # to use for icon: 0xa0005a
                bitmap id # of mask for icon: 0xa00061
                window id # of group leader: 0xa00002
XdndAware(ATOM) = BITMAP
_MOTIF_DRAG_RECEIVER_INFO(_MOTIF_DRAG_RECEIVER_INFO) = 0x6c, 0x0, 0x5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, 0x0
_NET_WM_ICON(CARDINAL) = 48, 48, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215, ... (MASSOR AV MER TEXT, DETTA ÄR EN IKON SOM PROGRAMMET ANVÄNDER)
_NET_WM_WINDOW_TYPE(ATOM) = _NET_WM_WINDOW_TYPE_NORMAL
WM_WINDOW_ROLE(STRING) = "buddy_list"
_NET_WM_SYNC_REQUEST_COUNTER(CARDINAL) = 10485849
WM_CLIENT_LEADER(WINDOW): window id # 0xa00002
_NET_WM_PID(CARDINAL) = 12589 *********** Detta är PID för programmet
WM_LOCALE_NAME(STRING) = "en_US.UTF-8"
WM_CLIENT_MACHINE(STRING) = "arlong-park"
WM_NORMAL_HINTS(WM_SIZE_HINTS):
                program specified location: 0, 0
                window gravity: NorthWest
WM_PROTOCOLS(ATOM): protocols  WM_DELETE_WINDOW, WM_TAKE_FOCUS, _NET_WM_PING, _NET_WM_SYNC_REQUEST
WM_CLASS(STRING) = "gaim", "Gaim"  ********* Detta identiferar fönstret
WM_ICON_NAME(STRING) = "Buddy List"
_NET_WM_ICON_NAME(UTF8_STRING) = 0x42, 0x75, 0x64, 0x64, 0x79, 0x20, 0x4c, 0x69, 0x73, 0x74
WM_NAME(STRING) = "Buddy List"
_NET_WM_NAME(UTF8_STRING) = 0x42, 0x75, 0x64, 0x64, 0x79, 0x20, 0x4c, 0x69, 0x73, 0x74  ************ Detta är en UTF8 sträng som beskriver namnet på fönstret
_NET_WM_PID(CARDINAL) = 12606 <--- PID för programmet.
_NET_WM_NAME(UTF8_STRING) = 0x42, 0x75, 0x64, 0x64, 0x79, 0x20, 0x4c, 0x69, 0x73, 0x74 <--- Namn på programmet.

Så du får skriva ett script som kollar igenom NET_CLIENT_LIST och matchar PID mot titeln i en map eller nåt.
The Black Mountain Scorpion Hoedown Bluegrass Experience Gang
From Left to Right: Wizard on Bicycle, Wizard on Bicycle, Wizard on Bicycle, Wizard on Bicycle, Wizard on Bicycle.
Användarvisningsbild
cupe
Inlägg: 650
Blev medlem: 05 jun 2008, 07:10
OS: Ubuntu
Utgåva: 12.04 Precise Pangolin LTS

Re: Lista Process med Fönstertitel?

Inlägg av cupe »

Sådärja, tackar! :)
Användarvisningsbild
gasol
Inlägg: 405
Blev medlem: 27 jul 2007, 14:57
Kontakt:

Re: Lista Process med Fönstertitel?

Inlägg av gasol »

Jag skrev ett litet perl-script för att hämta ut titlar av X-program:
Här är output för endast X-program.

Kod: Markera allt

<arlong-park /home/gasol/perl
> ./eps.pl
Pid      Program
12629    Gimmix
12606    Ubuntu Sverige • Visa kategori - Programmering - Mozilla Firefox
13747    hough.pdf - KPDF
24079    ARLONG-PARK - /home/gasol/perl - Shell - Konsole
24050    ARLONG-PARK - /home/gasol/perl - Shell - Konsole
24023    ARLONG-PARK - /home/gasol/perl - Shell - Konsole
12589    Buddy List
Detta är output då man listar alla program. X-program listar sina titlar från xprop medans de andra programmen listar command från ps-output.

Kod: Markera allt

Pid      Program
12631    mpd
12838    kdeinit Running...
12476    -tcsh
12632    mpd
12519    enlightenment
12846    klauncher [kdeinit]
12848    kded [kdeinit]
12835    yakuake
12853    -bin/tcsh
24045    vim eps.pl
12629    Gimmix
12585    /usr/bin/dbus-daemon --fork --print-pid 4 --print-address 8 --session
24050    ARLONG-PARK - /home/gasol/perl - Shell - Konsole
13885    SunAwtRobot 19 :0.0
12586    /usr/bin/dbus-launch --exit-with-session /opt/e17/bin/enlightenment_start
13747    hough.pdf - KPDF
12606    Ubuntu Sverige • Besvara - Mozilla Firefox
12645    /usr/bin/esd -terminate -nobeeps -as 1 -spawnfd 24
12653    gnome-screensaver
12589    Buddy List
12582    /usr/bin/ssh-agent /usr/bin/dbus-launch --exit-with-session /opt/e17/bin/enlightenment_start
12644    /bin/sh -c /usr/bin/esd -terminate -nobeeps -as 1 -spawnfd 24
24051    -bin/tcsh
12611    /usr/lib/libgconf2-4/gconfd-2 18
12581    /usr/bin/ssh-agent /usr/bin/ssh-agent /usr/bin/dbus-launch --exit-with-session /opt/e17/bin/enlightenment_start
24024    -bin/tcsh
24023    ARLONG-PARK - /home/gasol/perl - Shell - Konsole
24113    knotify [kdeinit]
12843    dcopserver [kdeinit] --nosid --suicide
3382     ps U gasol h o pid,command
12636    /usr/lib/control-center/gnome-settings-daemon
13223    java_vm
12616    mpd
24079    ARLONG-PARK - /home/gasol/perl - Shell - Konsole
24116    /usr/bin/artsd -F 10 -S 4096 -s 60 -m artsmessage -l 3 -f
24080    -bin/tcsh
3381     /usr/bin/perl ./eps.pl

Om man ändrar variabeln $show_all till 1 så kommer scriptet att lista alla processer och inte bara X-program. Du kan ju leka på och skriva om programmet tills du får det som du vill ha det...

Kod: Markera allt

#!/usr/bin/perl

use utf8;

sub ltrim($);

   $user = $ENV{USER};
   $show_all = 0;

   if($show_all == 1) {

      @pid_list = `ps U $user h o pid,command`;
      chomp(@pid_list);

      foreach (@pid_list) {
         $_ = ltrim($_);
         @s = split(/ /);
         $pid = $s[0];
         shift(@s);

         $pid_hash{$pid} = join(' ', @s);
      }
   }

   $xid_list = `xprop -root | grep _NET_CLIENT_LIST\\(WINDOW\\):`;
   chomp($xid_list);

   @xid_list = split(/# /,$xid_list);
   $xid_list[1]=~ s/,//g;

   @xid_list = split(/ /, $xid_list[1]);

   foreach (@xid_list) {
      @pid = `xprop -id $_ | grep _NET_WM_PID\\(CARDINAL\\)`;
      chomp(@pid);

      if (scalar(@pid) == 1) {
         @pid = split(/= /, $pid[0]);

         @name = `xprop -id $_ | grep _NET_WM_NAME\\(UTF8_STRING\\)`;
         @name = split(/= /, $name[0]);
         shift(@name);

         @chars = split(/, /, $name[0]);
         @bytes = map(hex, @chars);


         $name = pack('C*', @bytes);

         $pid_hash{$pid[1]} = $name;
      }
   }

   print "Pid \t Program\n";
   while(($pid, $command) = each(%pid_hash) ) {
      print "$pid \t $command\n";
   }

   sub ltrim($) {
      my $string = shift;
      $string =~ s/^\s+//;
      return $string;
   }
The Black Mountain Scorpion Hoedown Bluegrass Experience Gang
From Left to Right: Wizard on Bicycle, Wizard on Bicycle, Wizard on Bicycle, Wizard on Bicycle, Wizard on Bicycle.
Användarvisningsbild
cupe
Inlägg: 650
Blev medlem: 05 jun 2008, 07:10
OS: Ubuntu
Utgåva: 12.04 Precise Pangolin LTS

Re: Lista Process med Fönstertitel?

Inlägg av cupe »

gasol skrev:Jag skrev ett litet perl-script för att hämta ut titlar av X-program:
Här är output för endast X-program.

Kod: Markera allt

<arlong-park /home/gasol/perl
> ./eps.pl
Pid      Program
12629    Gimmix
12606    Ubuntu Sverige • Visa kategori - Programmering - Mozilla Firefox
13747    hough.pdf - KPDF
24079    ARLONG-PARK - /home/gasol/perl - Shell - Konsole
24050    ARLONG-PARK - /home/gasol/perl - Shell - Konsole
24023    ARLONG-PARK - /home/gasol/perl - Shell - Konsole
12589    Buddy List
Detta är output då man listar alla program. X-program listar sina titlar från xprop medans de andra programmen listar command från ps-output.

Kod: Markera allt

Pid      Program
12631    mpd
12838    kdeinit Running...
12476    -tcsh
12632    mpd
12519    enlightenment
12846    klauncher [kdeinit]
12848    kded [kdeinit]
12835    yakuake
12853    -bin/tcsh
24045    vim eps.pl
12629    Gimmix
12585    /usr/bin/dbus-daemon --fork --print-pid 4 --print-address 8 --session
24050    ARLONG-PARK - /home/gasol/perl - Shell - Konsole
13885    SunAwtRobot 19 :0.0
12586    /usr/bin/dbus-launch --exit-with-session /opt/e17/bin/enlightenment_start
13747    hough.pdf - KPDF
12606    Ubuntu Sverige • Besvara - Mozilla Firefox
12645    /usr/bin/esd -terminate -nobeeps -as 1 -spawnfd 24
12653    gnome-screensaver
12589    Buddy List
12582    /usr/bin/ssh-agent /usr/bin/dbus-launch --exit-with-session /opt/e17/bin/enlightenment_start
12644    /bin/sh -c /usr/bin/esd -terminate -nobeeps -as 1 -spawnfd 24
24051    -bin/tcsh
12611    /usr/lib/libgconf2-4/gconfd-2 18
12581    /usr/bin/ssh-agent /usr/bin/ssh-agent /usr/bin/dbus-launch --exit-with-session /opt/e17/bin/enlightenment_start
24024    -bin/tcsh
24023    ARLONG-PARK - /home/gasol/perl - Shell - Konsole
24113    knotify [kdeinit]
12843    dcopserver [kdeinit] --nosid --suicide
3382     ps U gasol h o pid,command
12636    /usr/lib/control-center/gnome-settings-daemon
13223    java_vm
12616    mpd
24079    ARLONG-PARK - /home/gasol/perl - Shell - Konsole
24116    /usr/bin/artsd -F 10 -S 4096 -s 60 -m artsmessage -l 3 -f
24080    -bin/tcsh
3381     /usr/bin/perl ./eps.pl

Om man ändrar variabeln $show_all till 1 så kommer scriptet att lista alla processer och inte bara X-program. Du kan ju leka på och skriva om programmet tills du får det som du vill ha det...

Kod: Markera allt

#!/usr/bin/perl

use utf8;

sub ltrim($);

   $user = $ENV{USER};
   $show_all = 0;

   if($show_all == 1) {

      @pid_list = `ps U $user h o pid,command`;
      chomp(@pid_list);

      foreach (@pid_list) {
         $_ = ltrim($_);
         @s = split(/ /);
         $pid = $s[0];
         shift(@s);

         $pid_hash{$pid} = join(' ', @s);
      }
   }

   $xid_list = `xprop -root | grep _NET_CLIENT_LIST\\(WINDOW\\):`;
   chomp($xid_list);

   @xid_list = split(/# /,$xid_list);
   $xid_list[1]=~ s/,//g;

   @xid_list = split(/ /, $xid_list[1]);

   foreach (@xid_list) {
      @pid = `xprop -id $_ | grep _NET_WM_PID\\(CARDINAL\\)`;
      chomp(@pid);

      if (scalar(@pid) == 1) {
         @pid = split(/= /, $pid[0]);

         @name = `xprop -id $_ | grep _NET_WM_NAME\\(UTF8_STRING\\)`;
         @name = split(/= /, $name[0]);
         shift(@name);

         @chars = split(/, /, $name[0]);
         @bytes = map(hex, @chars);


         $name = pack('C*', @bytes);

         $pid_hash{$pid[1]} = $name;
      }
   }

   print "Pid \t Program\n";
   while(($pid, $command) = each(%pid_hash) ) {
      print "$pid \t $command\n";
   }

   sub ltrim($) {
      my $string = shift;
      $string =~ s/^\s+//;
      return $string;
   }
Fan vad härligt, tack, uppskattas verkligen! Är tyvärr inte så haj på perl, men har ju iallafall en viss programmeringsvana så det ska nog lösa sig. Återigen, tack!
Användarvisningsbild
gasol
Inlägg: 405
Blev medlem: 27 jul 2007, 14:57
Kontakt:

Re: Lista Process med Fönstertitel?

Inlägg av gasol »

Det är lugnt hade lite tråkigt och det var länge sedan jag skrev nåt i perl. Så det var skoj att sitta å pilla lite ^_^
The Black Mountain Scorpion Hoedown Bluegrass Experience Gang
From Left to Right: Wizard on Bicycle, Wizard on Bicycle, Wizard on Bicycle, Wizard on Bicycle, Wizard on Bicycle.
Skriv svar

Återgå till "Terminalforum"