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