초기화 중: 재시작 명령은 정확히 어떻게 작동합니까?

초기화 중: 재시작 명령은 정확히 어떻게 작동합니까?

초기화를 작성하려고 하는데 재부팅\전원 끄기 문제를 알 수 없습니다. 분명히 재부팅은 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);
        .
        .
        .

관련 정보