Sida 1 av 1

Lista Process med Fönstertitel?

Postat: 04 jul 2008, 10:47
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?

Re: Lista Process med Fönstertitel?

Postat: 04 jul 2008, 11:15
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.

Re: Lista Process med Fönstertitel?

Postat: 04 jul 2008, 12:20
av cupe
Sådärja, tackar! :)

Re: Lista Process med Fönstertitel?

Postat: 04 jul 2008, 14:37
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;
   }

Re: Lista Process med Fönstertitel?

Postat: 04 jul 2008, 17:26
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!

Re: Lista Process med Fönstertitel?

Postat: 04 jul 2008, 19:08
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 ^_^