I stand corrected. I would have replied earlier, but my spam scanner 
decided your message was spam.

Anyway, grepping through all of my perl code didn't reveal any system() 
calls. Not surprising since I generally avoid system() like the plague. I 
usually open my commands using something similar to..

  open PS,"/bin/ps -p $pid |" or die "Couldn't spawn ps: $!\n";
  open LOCK,">$LOCK" or die "Could not create $LOCK: $!\n";
   or
  unlink $TMPERR or die "Error! Can't unlink $TMPERR: $!\n";

But after thinking about it, what you said makes sense and if it's in the 
Camel book, who am I to argue? :-)

Cheers, Stephen
--
Stephen Joyce
Systems Administrator                                            P A N I C
Physics & Astronomy Department                         Physics & Astronomy
University of North Carolina at Chapel Hill         Network Infrastructure
voice: (919) 962-7214                                        and Computing
fax: (919) 962-0480                               http://www.panic.unc.edu

Don't judge a book by its movie.

On Sun, 21 Oct 2007, Holger Parplies wrote:

> Hi,
>
> Stephen Joyce wrote on 21.10.2007 at 13:37:52 [Re: [BackupPC-users] Question 
> about wrapping rsync]:
>> On Sun, 21 Oct 2007, Holger Parplies wrote:
>>>> So, my script simply stops running after:
>>>> system("$rsyncPath @argList $newShare\n") || die "$rsyncPath @argList
>>>> $shareName failed!";
>>>
>>> Maybe because it should be "and" and not "or"? system returns the exit
>>> status of the program, so a 0 return value means success, causing the "die"
>>> to take effect. Aside from that, the die message quotes $shareName whereas
>>> the command uses $newShare. That may or may not be intended :).
>>
>> Actually, in perl it's common to use the "do something or die" syntax.
>
> right, where it makes sense, it is. Where it doesn't, it is not. system() is
> one of few examples where it doesn't. I didn't just accidentally point it
> out.
>
>> It does exactly what the syntax says; the first part must succeed (exit with
>> 0) or the program will die.
>
> Actually, Perl functions are in the general habit of returning something
> that evaluates to "true" for success. The value 0 is not a good example for
> this, because it is *not* "true". system() is simply an exception. See the
> Camel Book, page 143, for details. You are thinking of shell programming.
>
> The "or" operator (or "||", which is "or" with a higher precedence) behaves
> like an "or" (that's why it's called "or", believe it or not) with
> short-circuit evaluation. If the result is determinable from the first
> argument alone, the second is never evaluated. From a "false" value as first
> argument, the result of an "or" is not determinable, so the second argument
> is evaluated. From a "true" value, the result of the "or" is "true",
> regardless of what the other argument would evaluate to.
>
> This means, if something evaluates to "true" on success, then it makes
> sense to use the "foo or die" idiom (or "foo or bar" if you don't want to
> die but just need a drink). If something evaluates to "false" on success
> (and the system function is one of the rare examples of this), then this
> does *not* work. Look at the example in "perldoc -f system". It reads
>
>       system(@args) == 0
>           or die "system @args failed: $?"
>
> which is equivalent to either
>
>       not(system(@args)) or die "..."
>
> or
>
>       system(@args) and die "..."
>
> That seems strange at first sight. Note that we're not interested in the
> return value of the "and" (or "or") though. We only want the "die" to happen
> if and only if system(@args) evaluates to "false".
>
>> I would suggest modifying it to something like
>> system("$rsyncPath @argList $newShare\n") or die "$rsyncPath @argList
>> $shareName failed with error: $!\n";
>
> Even more wrong! system() does not put the error in $!. See the example
> from the Perl documentation above. $? is what you want to look at. And it's
> still "and" (or !system() or (system()==0) or ...).
>
>> But be careful that you're redirecting STDOUT and STDERR to a file
>> somewhere on the local host. Otherwise at that point in the script they may
>> go nowhere (see below).
>
> To that I can agree.
>
>>>> My question is - does BackupPC actively kill the "rsync" after the
>>>> backup is finished? I tried catching SIGPIPE and doing the cleanup
>>>> then, but that didn't help.
>>>
>>> Without looking at the code, I would suspect BackupPC to close the socket
>>> after transfer is finished (what else should it do? Wait for the remote side
>>> to close it?). I would imagine that might generate a SIGHUP (probably only
>>> if you've got a controlling tty). SIGPIPE should only be triggered if you
>>> try to write to a closed socket.
>>
>> I'd guess that this is exactly what's happening; BackupPC closes the
>> socket. Depending on the script on the remote side it could continue or die
>> when it loses it's controlling tty.
>>
>> I'm not sure there's a way to do what you want without using DumpPreUserCmd
>> and DumpPostUserCmd scripts.
>
> Where's the problem? We've just agreed that BackupPC almost certainly does
> nothing more than close the socket. There's nothing that is *forcing* the
> script on the remote side to die (as would a SIGKILL), it's just a matter of
> handling whatever circumstance is not yet handled correctly. The rest of the
> script is apparently working, so why give up now?
>
> Regards,
> Holger
>
>
> -- 
>
>

-------------------------------------------------------------------------
This SF.net email is sponsored by: Splunk Inc.
Still grepping through log files to find problems?  Stop.
Now Search log events and configuration files using AJAX and a browser.
Download your FREE copy of Splunk now >> http://get.splunk.com/
_______________________________________________
BackupPC-users mailing list
BackupPC-users@lists.sourceforge.net
List:    https://lists.sourceforge.net/lists/listinfo/backuppc-users
Wiki:    http://backuppc.wiki.sourceforge.net
Project: http://backuppc.sourceforge.net/

Reply via email to