Why are reboot, shutdown and poweroff symlinks to systemctl?
Many programs make use of this technique where there is a single executable that changes its behavior based on how it was executed.
There's typically a structure inside the program called a case/switch statement that determines the name the executable was called with and then will call the appropriate functionality for that executable name. That name is usually the first argument the program receives. For example, in C
when you write:
int main(int argc, char** argv)
argv[0]
contains the name of the called executable. At least, this is the standard behaviour for all shells, and all executables that use arguments should be aware of it.
Example in Perl
Here's a contrived example I put together in Perl which shows the technique as well.
Here's the actual script, call it mycmd.pl
:
#!/usr/bin/perl
use feature ':5.10';
(my $arg = $0) =~ s#./##;
my $msg = "I was called as: ";
given ($arg) {
$msg .= $arg when 'ls';
$msg .= $arg when 'find';
$msg .= $arg when 'pwd';
default { $msg = "Error: I don't know who I am 8-)"; }
}
say $msg;
exit 0;
Here's the file system setup:
$ ls -l
total 4
lrwxrwxrwx 1 saml saml 8 May 24 20:49 find -> mycmd.pl
lrwxrwxrwx 1 saml saml 8 May 24 20:34 ls -> mycmd.pl
-rwxrwxr-x 1 saml saml 275 May 24 20:49 mycmd.pl
lrwxrwxrwx 1 saml saml 8 May 24 20:49 pwd -> mycmd.pl
Now when I run my commands:
$ ./find
I was called as: find
$ ./ls
I was called as: ls
$ ./pwd
I was called as: pwd
$ ./mycmd.pl
Error: I don't know who I am 8-)
Related videos on Youtube
Gradient
Updated on September 18, 2022Comments
-
Gradient almost 2 years
In Arch Linux, if I do
ls -l
in/sbin
, I can see thatreboot
,shutdown
andpoweroff
are all symlinks to/usr/bin/systemctl
. But issuingreboot
,shutdown
andsystemctl
commands obviously does not all have the same behaviour.Is
ls -l
not showing me full information regarding symlinks? How can I, for example, know what the real symlink ofreboot
is?-
JdeBP over 6 yearsFor more on this, see unix.stackexchange.com/a/196014/5132 .
-
-
jordanm about 11 yearsSee also:
ssh-argv0
-
Gradient about 11 yearsThank you! This is a trick I didn't think about.
-
Fake Name about 11 yearsThis is actually how BusyBox works. It has a single binary that acts as most of the common GNU utilities.
-
Bakuriu about 11 yearsThe arguments to the
main
are reversed.argc
comes beforeargv
. -
BatchyX about 11 yearsin C, you can't make a switch statement with strings.
-
slm about 11 yearsThanks for the feedback. Someone else added that bit to my answer. This answer is just giving the OP the gist of how/why the links are present in his /sbin directory. There are ways to get the functionality via switch as described here in C/C++. The concept is what matters not the semantics.
-
user about 11 years+1 for "I don't know who I am" :)
-
pa4080 about 6 yearsI've copy/paste part of this answer in AU where is provided also and Bash example: askubuntu.com/a/1023946/566421
-
Grimm about 3 yearsI just wondered why this isn't considered bad programming style: By making systemctl doing the switch on the various names of callers ('shutdown', 'reboot', etc.) effectively additional dependencies are created. Wouldn't it be better to let 'shutdown' just be a simple command calling 'systemctl poweroff' (and let systemctl as-is)?