Re: Redis installation error(s) on Debian SID
>> In previous messages:
>
> system('systemctl', '--quiet', [...] , @start_units) == 0
> or die("Could not execute systemctl: $!");
>
> Could not execute systemctl: at /usr/bin/deb-systemd-invoke line 148.
See the ":" followed by two spaces? Unlike systemctl, well-behaved
programs set "errno" when they puke, and that setting is turned into
a more-or-less useful error message like "Permission denied".
"$!" would have held that message.
I would try removing "'--quiet'," from the system() call -- maybe
systemctl didn't get something it needed in the argument list.
I'd also use the full path ('/usr/bin/systemctl' or whatever) because
otherwise you're trusting $PATH to be set correctly.
>> On Sat 12 Oct 2024 at 14:10:20 (-0400), Thomas Schmitt wrote:
> Well, if perl is not more awkward than i believe anyways, then the
> message is emitted if the run of program systemctl fails. The reasons
> for such a failure are manifold, from botched installation to lack of
> disk space...
Exactly right, and we shouldn't have to guess.
> I imagine a pressured perl programmer who has to invent a
> comprehensive error message and thinks "Let them look up the code
> on their own". So the users get shown the script name and the line
> number.
I avoid using system() because it's bitten me in the ass before; any
metacharacters in any argument cause the whole thing to be passed to a
shell, which can result in all sorts of entertainment. If I ever have
to use it in a perl script, I make a safe wrapper. I've attached a
small example.
--
Karl Vogel I don't speak for anyone but myself
Manhunt Underway After Lubed-Up Diddy Slips Out From Between Prison Bars
--Babylon Bee, 20 Sep 2024
Perl script cleverly called "tst":
1 #!/usr/bin/perl
2 #<tst: try a wrapper around system().
3
4 use Modern::Perl;
5 use subs qw/safesys/;
6
7 my @instance_args = ('i1', 'i2');
8 my $action = 'do-something';
9 my @start_units = ('st1', 'st2', 'st3');
10
11 print "Calling safesys, should work...\n";
12 safesys('/bin/ls', '-lF', "$0");
13
14 print "\n...calling safesys again...\n";
15 safesys('systemctl', '--quiet', @instance_args, $action, @start_units);
16
17 print "...should not get here\n";
18 exit(0);
19
20 # -------------------------------------------------------------------
21 # safesys: run a command using system, view any unexpected results.
22 sub safesys {
23 unless (system(@_) == 0) {
24 my ($package, $filename, $line) = caller;
25
26 printf " PACKAGE: %s\n FILE: %s\n LINE: %d\n",
27 $package, $filename, $line;
28
29 print "system() failed with arguments:\n ";
30 print "[$_] " foreach @_;
31 print "\n";
32
33 if ($? == -1) {
34 print "failed to execute: $!\n";
35 }
36 elsif ($? & 127) {
37 printf "child died with signal %d, %s coredump\n",
38 ($? & 127), ($? & 128) ? 'with' : 'without';
39 }
40 else {
41 printf "child exited with value %d\n", $? >> 8;
42 }
43
44 exit($?);
45 }
46 }
When I run it, the first call succeeds in passing its own name to "ls".
I don't have systemctl installed on my machine, so the second call fails
at line 23. I use "caller" to see where the problem actually occurred
(line 15) and what args were passed to systemctl:
me% ./tst
Calling safesys, should work...
-rwxr-xr-x 1 vogelke mis 1242 Oct 12 21:37 ./tst*
...calling safesys again...
Can't exec "systemctl": No such file or directory at ./tst line 23.
PACKAGE: main
FILE: ./tst
LINE: 15
system() failed with arguments:
[systemctl] [--quiet] [i1] [i2] [do-something] [st1] [st2] [st3]
failed to execute: No such file or directory
As you can see, the script never makes it to line 17.
Reply to: