On 03/27/14 23:26, Alexander Hall wrote:
On 03/27/14 23:07, Philip Guenther wrote:
On Thu, Mar 27, 2014 at 3:00 PM, Philip Guenther <guent...@gmail.com>
wrote:
On Thu, Mar 27, 2014 at 2:28 PM, sven falempin
<sven.falem...@gmail.com> wrote:
Sometimes i feel curse (or maybe just tired) :

main::(/bin/check_network.pl:164):      my $src =
system('/usr/bin/pkill -HUP -f "dhclient: trunk0"');
   DB<2> n
main::(/bin/check_network.pl:165):        if ($src) {
   DB<2> p $src
33024

Of course pkill is supposed to return 0,1,2 or 3 and it does in the
shell

perldoc -f system
...
                The return value is the exit status of the program as
returned
                by the "wait" call.  To get the actual exit value,
shift right
                by eight (see below).  See also "exec".  This is not
what you

33024 >> 8 == 129

(Stupid gmail control-enter==Send)

So, why is it returning 129?  Well, since you gave system() a single
string it's actually invoked via the shell.  Why would the shell
report a status of 129?
      ?        The exit status of the last non-asynchronous command
executed.
               If the last command was killed by a signal, $? is set
to 128
               plus the signal number.

So, pkill is dying with signal 1 == HUP.  Hey, wait a minute, pkill's
criteria matches its own command line, so it will kill itself!  Time
to be more clever about the criteria...

If I'm not totally mistaken, pkill is expected not to kill itself, just
as pgrep is expected not to list itself either.

Ah, but it could be killing the shell that system() spawns to run pkill!

If so (and even if not), lession to learn (#2): Don't invoce system() with a single argument unless you really need the shell parsing.

/Alexander

Reply via email to