初期化を作成しようとしていますが、再起動\電源オフの問題がわかりません。明らかに、再起動はsystemctlへのリンクにすぎませんか? (私はアーチを使用しています。)では、これはどのように機能しますか?init poweroff
動作するか、それに似ているが、reboot
/poweroff
単にリンクにリンクされているようです。systemctl
ベストアンサー1
多くのプログラムは、呼び出される名前によって異なる動作をします。systemctl
小切手の値と似ているargv[0]
場合、reboot
動作は異なりますsystemctl
。極端に取られたことを見ることができる忙しい箱は、すべてのコマンドを単一のバイナリにシンボリックリンクして、ほぼ完全な(最小)ユーザースペースを提供する単一のバイナリですbusybox
。
シェルスクリプトを使用して同じことを実行できます。
#!/bin/bash
if [[ $0 =~ foo ]]; then
echo "running foo action"
elif [[ $0 =~ bar ]]; then
echo "running bar action"
else
echo "running default action"
fi
仮定multicall.sh
すると、次のように設定します。
ln -s multicall.sh foo
ln -s multicall.sh bar
次に、以下を参照してください。
$ ./foo
running foo action
$ ./bar
running bar action
$ ./multicall.sh
running default action
特にsystemctl
、ロジックが実装されます。ここ:
int systemctl_dispatch_parse_argv(int argc, char *argv[]) {
assert(argc >= 0);
assert(argv);
if (invoked_as(argv, "halt")) {
arg_action = ACTION_HALT;
return halt_parse_argv(argc, argv);
} else if (invoked_as(argv, "poweroff")) {
arg_action = ACTION_POWEROFF;
return halt_parse_argv(argc, argv);
} else if (invoked_as(argv, "reboot")) {
if (kexec_loaded())
arg_action = ACTION_KEXEC;
else
arg_action = ACTION_REBOOT;
return halt_parse_argv(argc, argv);
.
.
.