Avatar billede Slettet bruger
17. april 2004 - 15:01 Der er 17 kommentarer og
1 løsning

isolere PID

$str = shell_exec('ps -U noname');
print("<PRE>");
print_r($str);
print("</PRE>");

outputter:

  PID TTY          TIME CMD
12954 ?        00:00:00 screen
12955 pts/2    00:00:00 myprog


hvis jeg efter den første kode skriver

$array = array ($str);
$screen = preg_grep("/screen/", $array);
print_r($screen);

så outputter den:

  PID TTY          TIME CMD
12954 ?        00:00:00 screen
12955 pts/2    00:00:00 myprog

Array ( [0] => PID TTY TIME CMD 12954 ?        00:00:00 12955 pts/2    00:00:00 myprog )

Nu er det sådan at jeg gerne vil have hver enkel linje isoleret for derefter at kunne isolere PID til processen "screen"
dvs:

Array (
[0] => PID TTY TIME CMD
[1] => 12954 ?        00:00:00 screen
[2] => 12955 pts/2    00:00:00 myprog
)

bagefter skal jeg så have isoleret ordet "screen" og udtrække den første værdi (altså PID) = 12954

nogen der kan hjælpe mig på vej?
Avatar billede dennismp Nybegynder
17. april 2004 - 15:05 #1
prøv:
foreach($array as $a) {
  if( preg_match("/^(\d+)\s+([^\s]+)\s+\d{2}:\d{2}:\d{2}\s(\w+)/", $a, $match) ) {
    print_r($match[1]);
  }
}
Avatar billede Slettet bruger
17. april 2004 - 15:11 #2
nu er det jo ikke sikkert at screen kommer som [1] hvis jeg starter andre processer så kan den muligtvis ligge som [4]


<?php

$str = shell_exec('ps -U noname');
print("<PRE>");
print_r($str);
print("</PRE>");

$array = array ($str);

foreach($array as $a) {
  if( preg_match("/^(\d+)\s+([^\s]+)\s+\d{2}:\d{2}:\d{2}\s(\w+)/", $a, $match) ) {
    print_r($match[1]);
  }
}
?>

outputter

  PID TTY          TIME CMD
12954 ?        00:00:00 screen
12955 pts/2    00:00:00 myprog
Avatar billede dennismp Nybegynder
17. april 2004 - 15:17 #3
<?php
$str = shell_exec('ps -U noname');
$array = explode("\n",$str);
$pid = '';
foreach($array as $a) {
    if( preg_match("/^(\d+)\s+([^ ]+)\s+\d{2}:\d{2}:\d{2}\s(\w+)/", $a, $match) ) {
    if( $match[3] == 'bash' ) {
        $pid = $match[1];
    }
  }
}
if( !empty( $pid ) )
    print "fandt: $pid";
?>
Avatar billede Slettet bruger
17. april 2004 - 15:43 #4
outputter intet.

når jeg printer array så kommer det dog som jeg forklarede at det skulle (ny linje = stigning i værdi i array)

kan man ikke sætte den til at først lede efter 'screen' i array og derefter afhængigt af resultatet få den til at udvælge den første talværdi?
Avatar billede dennismp Nybegynder
17. april 2004 - 15:49 #5
Hmm, det virker fint her. Man kan gøre det på mange måder, så jo man kan godt søge efter screen og tage udgangspunkt i det.

Du kunne også udføre kommandoen
ps -U noname |grep screen

så får du kun screen-linjen/linjerne ud.

Du kan jo prøve at skrive $a ud, inde i foreach-løkken. Evt print_r($match) efter preg_match for at få lidt output hver gang den matcher (hvis den gør.)
Avatar billede dennismp Nybegynder
17. april 2004 - 15:59 #6
<?php
$str = shell_exec('ps -U noname');
$array = explode("\n",$str);
$pid = '';
foreach($array as $a) {
    if( preg_match("/^(\d+)\s+([^ ]+)\s+\d{2}:\d{2}:\d{2}\s(\w+)/", $a, $match) ) {
    if( $match[3] == 'screen' ) {
        $pid = $match[1];
    }
  }
}
if( !empty( $pid ) )
    print "fandt: $pid";
?>
Avatar billede dennismp Nybegynder
17. april 2004 - 15:59 #7
har ændret $match[3] == 'bash' til at finde 'screen' istedet :-)
Avatar billede Slettet bruger
17. april 2004 - 16:00 #8
eftersom jeg er helt sikker på der kun vil være 1 screen linje ved brugeren vil det vel være det smarteste at bruge ps -U noname |grep screen

hvordan vil jeg så kunne isolere selve tallet i starten af linjen? med explode eller er der en smartere måde?
Avatar billede Slettet bruger
17. april 2004 - 16:01 #9
prøver lige med det så :)
Avatar billede Slettet bruger
17. april 2004 - 16:08 #10
ja det virkede _men_ jeg har også en nobody2 user som kører det samme program...

output i shell

#ps -U nobody
  PID TTY          TIME CMD
12954 ?        00:00:00 screen

og

# ps -U nobody2
  PID TTY          TIME CMD
2514 ?        00:00:00 screen

der er et mellemrum til forskel og der står scriptet af..
Avatar billede Slettet bruger
17. april 2004 - 16:09 #11
og det gad exp ikke vise ordentligt

# ps -U nobody2
  PID TTY          TIME CMD
2514 ?        00:00:00 screen
Avatar billede Slettet bruger
17. april 2004 - 16:10 #12
argh :P

der er altså et space foran 2514
Avatar billede dennismp Nybegynder
17. april 2004 - 16:10 #13
prøv med:
if( preg_match("/^\s*(\d+)\s+([^ ]+)\s+\d{2}:\d{2}:\d{2}\s(\w+)/", $a, $match) ) {

(har indsat en \s* lige efter ^)
Avatar billede Slettet bruger
17. april 2004 - 16:12 #14
ja nu virker det.. men vil det også virke hvis der var 2 spaces foran eller pid bliver 6 cifret?
Avatar billede Slettet bruger
17. april 2004 - 16:41 #15
du skal også lige huske at lægge et svar....

desuden kender du en måde at komme uden om

#su nobody2 -c "screen -mdS test"

problemet er at den beder om nobody2s password. Det er meningen jeg skal kunne stoppe og starte programmet igennem php
Avatar billede dennismp Nybegynder
17. april 2004 - 17:13 #16
ja, det skulle det gerne (\s+ betyder 1 eller flere spaces, \s* nul eller flere spaces, \d+ 1 eller flere cifre.. osv)

Kan du ikke bare give din apache-bruger rettigheder til at udføre kommandoen screen? ellers prøv at se på sudo
Avatar billede dennismp Nybegynder
17. april 2004 - 17:14 #17
hovsa, et svar til herren :)
Avatar billede Slettet bruger
18. april 2004 - 05:15 #18
Hovsa lidt point til herren :D

jeg takker for hjælpen
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester