Gregory Machin am Freitag, 15. Dezember 2006 14:05: > On 12/14/06, D. Bolliger <[EMAIL PROTECTED]> wrote: > > Gregory Machin am Donnerstag, 14. Dezember 2006 13:24:
[reordered] > > > #!/usr/bin/perl > > > > > > # if your prgram has the string "grep" in the name or in the path > > > # this program won't work. > > > > > > use strict; > > > use warnings; > > > > > > my $line; > > > my $input; > > > > > > $input=$ARGV[0]; #$input="httpd"; > > > chomp $input; > > > open PROS, "ps -ef|grep $input |"; > > > > > > while ($line = <PROS>){ > > > unless ($line =~ m/grep/){ > > > print "$input is running\n"; > > > exit; > > > } > > > } > > > > > > print "$input isn't running\n"; > > > exec "/etc/init.d/$input restart &"; > > > the script will not work > > > > "Not work?" :-) > > > > > if I use $ARGV[0] but works 100% if I hard > > > code the $input variable; > > > what have i missed ? > > > > You can give anything as cmd line argument, and the script will tell you > > that it is not running, because of > > > > a) open PROS, "ps -ef|grep $input |"; > > combined with > > b) unless ($line =~ m/grep/){...} > > > > This script is running as root... that makes it even more important to > > check user provided data, what exactly is executed in the shell, and what > > binaries are called. > > > > - use absolute paths for binaries (ps and grep in this case) > > - make sure that $input only contains ascii characters > > for example, in this case, only a to z: > > > > my ($input) = $ARGV[0]=~/([a-z]{,16})/; # untested > > die unless $input; > > > > btw: /etc/init.d/grep start ??? > > > > This is a hint to also check if $input corresponds to a binary > > in /etc/init.d at the beginning of the script :-) > > > > This would solve the grep-not-allowed/script-uses-grep-and-does-not-work > > problem :-) > > > > What about also using /etc/init.d/some_daemon status and check if this > > information is in sync with the ps output (it isn't always, and the > > restart could therefore fail - what you don't test) > Hi thanks for looking at the script.. > > Just to clarify, the scipt runs perfectly if $input it hardcoded eg > $input="httpd". > thus if the process is running then it exits, if the process is not > running then it exicutes > exec "/etc/init.d/$input restart &"; Hm, possibly I overlooked something, misinterpreted my tests (with modified code), and guessed wrong. At the moment I have no time to look further at it, so just a small tip: > But if I use $input=$ARGV[0] to give the process name from the command > line, it runs as if the process is running if if I have stoped/killed > it.. > > the only reason for this is that there is a hidden character, but > where is it comming from ? What hidden character is it? I think it's not a line end character \r, \n, ^M... (you chomp()) What results when you print out $input and the cmdline to be executed like this, to see the string between '<' and '>': warn "<$whatever_to_print>"; ? Dani P.S.: Please post inline :-) -- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED] <http://learn.perl.org/> <http://learn.perl.org/first-response>