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?
Annonceindlæg tema
Cloud & AI
I dette særtema ser vi på, hvordan cloud og AI bliver fundamentet for virksomhedernes digitale forretning, og hvordan de nye muligheder for automatisering og forretningsværdi kan udnyttes uden at miste overblik, sikkerhed og menneskelig kontrol.
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]); } }
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
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"; ?>
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?
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.)
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"; ?>
17. april 2004 - 15:59
#7
har ændret $match[3] == 'bash' til at finde 'screen' istedet :-)
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?
Slettet bruger
17. april 2004 - 16:01
#9
prøver lige med det så :)
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..
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
Slettet bruger
17. april 2004 - 16:10
#12
argh :P der er altså et space foran 2514
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 ^)
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?
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
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
17. april 2004 - 17:14
#17
hovsa, et svar til herren :)
Slettet bruger
18. april 2004 - 05:15
#18
Hovsa lidt point til herren :D jeg takker for hjælpen
Vi tilbyder markedets bedste kurser inden for webudvikling