Wie pa4080 sagt , handelt es sich nur um eine normale symbolische Verknüpfung , die systemctl
selbst überprüft, unter welchem Namen sie ausgeführt wurde, um zu entscheiden, welche Aktion ausgeführt werden soll. Dies kann mit jedem Mechanismus erreicht werden, der bewirkt, dass dieselbe ausführbare Datei unter mehreren Namen ausgeführt wird. In der Praxis wird dies durch die Verwendung von Symlinks oder Hardlinks erreicht . Auf GNU / Linux-Systemen wie Ubuntu werden zu diesem Zweck am häufigsten Symlinks verwendet.
In Ubuntu Releases mit systemd (derzeit alle umfassen unterstützte Versionen außer 14.04 LTS, die verwendet Upstart ), nicht nur den reboot
Befehl , sondern auch die halt
,poweroff
, runlevel
, shutdown
, und telinit
Befehle sind alle Symlinks /bin/systemctl
:
$ file /sbin/{halt,poweroff,reboot,runlevel,shutdown,telinit}
/sbin/halt: symbolic link to /bin/systemctl
/sbin/poweroff: symbolic link to /bin/systemctl
/sbin/reboot: symbolic link to /bin/systemctl
/sbin/runlevel: symbolic link to /bin/systemctl
/sbin/shutdown: symbolic link to /bin/systemctl
/sbin/telinit: symbolic link to /bin/systemctl
Die genauen Aktionen, systemctl
die basierend auf dem Namen ausgeführt werden, den Sie zum Ausführen verwenden, sowie andere Möglichkeiten, wie Sie diese Aktionen angeben können, werden in dieser hervorragenden Antwort von JdeBP auf Was ist der Unterschied zwischen diesen Befehlen zum Herunterfahren eines Linux-Servers? auf Unix.SE . Wie es erklärt, dienen diese Befehle (außer runlevel
) als Abkürzung für systemctl isolate ...
Befehle, ...
die durch unterschiedliche Ziele ersetzt wurden.
Falls Sie interessiert sind, befindet sich der C-Code, der berücksichtigt, welchen Namen Sie bei der systemctl
Entscheidung, welche Aktion ausgeführt werden soll, aufgerufen haben, in der in parse_argv
definierten Funktion systemctl.c
, die derzeit in Zeile 6972 dieser Datei beginnt. Um es zu finden, können Sie suchen nach:
static int parse_argv(int argc, char *argv[]) {
Die relevanten Teile umfassen den größten Teil dieser Funktion, aber alles ähnelt in etwa diesem Fragment, setzt sich ähnlich fort, jedoch mit unterschiedlichem Code für jede Zeichenfolge und mit einigen anderen Überprüfungen und Verzweigungslogiken:
if (strstr(program_invocation_short_name, "halt")) {
arg_action = ACTION_HALT;
return halt_parse_argv(argc, argv);
} else if (strstr(program_invocation_short_name, "poweroff")) {
arg_action = ACTION_POWEROFF;
return halt_parse_argv(argc, argv);
} else if (strstr(program_invocation_short_name, "reboot")) {
Andere Beispiele von Befehlen , die untersuchen , wie sie (manchmal) aufgerufen wurden anders handeln umfassen vim
, die anders verhält , wenn laufen , wie vim
, ex
, view
, gvim
, gview
, und einige andere; ip
siehe diese Frage ; gksu
siehe diese Frage ; less
, das sein Aussehen ändert, wenn es benannt wirdmore
(aber Sie können im Gegensatz zu Ubuntu trotzdem bidirektional scrollen more
); busybox
;; und die meisten Shells im Bourne-Stil , wie bash
und zsh
, die sich automatisch besser mit den POSIX-Anforderungensh
kompatibel verhalten, wenn sie als ausgeführt werden sh
.