初期化中:再起動コマンドは正確にどのように機能しますか?

初期化中:再起動コマンドは正確にどのように機能しますか?

初期化を作成しようとしていますが、再起動\電源オフの問題がわかりません。明らかに、再起動は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);
        .
        .
        .

おすすめ記事