• Das Erstellen neuer Accounts wurde ausgesetzt. Bei berechtigtem Interesse bitte Kontaktaufnahme über die üblichen Wege. Beste Grüße der Admin

Split?

lampe

New member
Hallo zusammen

Hat jemand eine Idee wie man dies machen kann?

Ich habe ein Programm geschrieben, welches hängende Prozesse auf dem System erkennt. Nun möchte ich das in unser Monitoring einbinden. Aus diesem Grund soll es mir nun den Command auch anzeigen. Mein Problem ist folgendes:

Code:
my $hangingProcessFound = "false";
my $nagiosMessage = "";

for (my $k = 1; $k < $#processes + 1; $k++) {
        my $process = @processes[$k];
        $process =~ s/^\s+//;
        my @process_array = split(/\s+/, $process);
        my $pid = $process_array[1];
        my $command = $process_array[4];
        my @measure_one_process;
wenn ich dies mit dem Split mache, kappt es mir den Command ab.

Folgende Zeile:

Code:
infrasys 22822     1  0 06:00 ?        00:00:01 /usr/bin/nmon -ft -s 60 -c 360 -m /var/log/nmon

Ihr seht die letzte Spalte /usr/bin/nmon -ft -s 60 -c 360 -m /var/log/nmon

die wird mir dann so angezeigt:

Code:
/usr/bin/nmon

wie kann ich das am besten umgehen?

Danke für eure Unterstützung
 
mhh split mach doch genau das was du sagst, trenne den string an jedem leerzeichen, und wenn du dann auf array(4) zugreifst bekommst dann auch nur den Teil...

warum nimmst du nicht "check_procs" um zombies usw. zu finden?!
 
Mein Script findet schon selber die Zombies. Siehst du denn keine Möglichkeit aus der Variabel $process den String (command) herauszunehmen?
 
Der Code ist sehr "unperlig"

Kaum jemand nutzt in Perl in einer Schleife über ein Array den Index, dafür gibt es doch foreach

PHP:
foreach my $process(@process) {

Ansonsten gilt das was kkapsner vorgeschlagen hat
 
Ich habs anders gelöst:

Code:
for (my $k = 1; $k < $#processes + 1; $k++) {
        my $process = @processes[$k];
        $process =~ s/^\s+//;
        my @process_array = split(/\s+/, $process);
        my $pid = $process_array[1];
        my @measure_one_process;
        my $last_index = @process_array;
        my @command_array = @process_array[4..$last_index];
        my $command_string = "";

        foreach my $c (@command_array) {
                $command_string = $command_string . " " . $c;
        }

@kkapsner: wenn du den ganzen code sehen würdest, glaube ich hättest es du auch so gemacht (kann ihn sonst auch posten).

danke trotzdem für eure Antworten!
 
unperlig!

Willst du eigentlich wirklich ab dem 5. Element alles als command String? Mit deinen Beispieldaten kommt das was unsinniges raus.

PHP:
my @process = (
'infrasys 22822     1  0 06:00 ?        00:00:01 /usr/bin/nmon -ft -s 60 -c 360 -m /var/log/nmon'
);
foreach my $process(@process) {  
        $process =~ s/^\s+//;
        my ($pid, @part) = split(/\s+/, $process);
		my $command_string = join ' ', @part[6..12];
		print "$pid\n $command_string";
}
 
In meinem Array stehen diese Daten (nur damit du weisst, weshalb ich es so mache)

Code:
13-17:06:32  2091 root      0.0 [kmpathd/1]
13-17:06:32  2093 root      0.0 [kmpath_handlerd]
13-17:06:28  2123 root      0.0 [kjournald]
13-17:06:28  2126 root      0.0 [kjournald]
13-17:06:28  2131 root      0.0 [kjournald]
13-17:06:28  2136 root      0.0 [kjournald]
13-17:06:28  2144 root      0.0 [kjournald]
13-17:06:28  2154 root      0.0 [kjournald]
13-17:06:28  2157 root      0.0 [kjournald]
13-17:06:21  2626 root      0.0 auditd
13-17:06:21  2628 root      0.0 /sbin/audispd
13-17:06:20  2649 root      0.0 syslogd -m 0
13-17:06:20  2652 root      0.0 klogd -x
13-17:06:20  2668 root      0.0 irqbalance
13-17:06:20  2690 rpc       0.0 portmap
13-17:06:20  2719 root      0.0 rpc.statd
13-17:06:19  2762 root      0.0 [rpciod/0]
13-17:06:19  2763 root      0.0 [rpciod/1]
13-17:06:19  2770 root      0.0 rpc.idmapd
13-17:06:17  2834 root      0.0 [vmmemctl]
13-17:06:16  2892 root      0.0 /usr/lib/vmware-tools/sbin32/vmware-guestd --background /var/run/vmware-guestd.pid
13-17:06:15  2955 root      0.0 automount
13-17:06:14  2981 root      0.0 /usr/sbin/sshd
13-17:06:14  2997 root      0.0 xinetd -stayalive -pidfile /var/run/xinetd.pid
13-17:06:13  3021 root      0.0 sendmail: accepting connections
13-17:06:13  3029 smmsp     0.0 sendmail: Queue runner@01:00:00 for /var/spool/clientmqueue
13-17:06:13  3045 root      0.0 gpm -m /dev/input/mice -t exps2
13-17:06:12  3060 root      0.0 crond
13-17:06:12  3089 root      0.0 /usr/sbin/atd
13-17:06:07  3185 root      0.0 /sbin/mingetty tty1
13-17:06:07  3186 root      0.0 /sbin/mingetty tty2
13-17:06:07  3187 root      0.0 /sbin/mingetty tty3
13-17:06:07  3188 root      0.0 /sbin/mingetty tty4
13-17:06:07  3189 root      0.0 /sbin/mingetty tty5
13-17:06:07  3190 root      0.0 /sbin/mingetty tty6
13-17:06:05  3242 root      0.0 /usr/bin/python -tt /usr/sbin/yum-updatesd
13-17:06:05  3244 root      0.0 /usr/libexec/gam_server
   14:47:36  3448 root      0.5 /usr/bin/ruby /usr/sbin/puppetd --logdest=/var/log/puppet/puppet.log --report
13-17:04:51  3928 ntp       0.0 ntpd -u ntp:ntp -p /var/run/ntpd.pid
13-17:04:41  4303 root      0.0 /usr/sbin/snmpd -Lsd -Lf /dev/null -p /var/run/snmpd.pid -a
   01:16:38 10755 infrasys  0.0 /usr/bin/nmon -ft -s 60 -c 360 -m /var/log/nmon
      07:07 14969 root      0.0 su -
      07:07 14972 root      0.0 -bash
      06:56 15008 root      0.0 vim compare_measures.pl
      02:23 15183 root      0.0 sshd: S105725 [priv]
      02:16 15185 S105725   0.0 sshd: S105725@pts/1
      02:16 15186 S105725   0.0 -bash
      02:11 15215 root      0.0 su
      02:11 15218 root      0.0 bash
      00:00 15335 root      0.0 ps -eo etime,pid,user,pcpu,args
   04:30:54 30557 root      0.0 sshd: s111897 [priv]
   04:30:53 30559 S111897   0.0 sshd: S111897@pts/0
   04:30:53 30560 S111897   0.0 -bash
 
Die erste Zeile möchte ich gar nicht denn wenn du den ps-command ausführst ist die erste Zeile wie ein Header --> cpu und so.
Naja, da würde ein shift reichen.

PHP:
#!/usr/bin/perl -w
use strict;
my @process = <DATA>;
shift @process; # du willst die erste Zeile nicht

foreach my $process(@process) {  
		
        $process =~ s/^\s+//;
        my ($pid, @part) = split(/\s+/, $process);
		
		my $command_string = join ' ', @part[3..$#part];
		print "$pid $command_string\n";
}
 
Zurück
Oben