컴퓨터가 종료되거나 다시 시작되기 전에 실행하고 싶은 스크립트가 있는데 매개 start
변수가 아닌 인수로만 트리거되기 stop
때문에 미치게 됩니다.
내 시스템에는 다음 기호 링크가 있습니다.
/etc/rc0.d/K01init.sh
/etc/rc1.d/K01init.sh
/etc/rc2.d/S99init.sh
/etc/rc3.d/S99init.sh
/etc/rc4.d/S99init.sh
/etc/rc5.d/S99init.sh
/etc/rc6.d/K01init.sh
둘 다 동일한 스크립트를 가리킵니다./etc/init.d/init.sh. 다른 스레드를 기반으로 .sh
접미사 없이 시도해 보았지만 아무 것도 변경되지 않았습니다.
/etc/init.d/init.sh
#!/bin/sh
### BEGIN INIT INFO
# Provides: init.sh
# Required-Start: $all
# Required-Stop:
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: xxx
# Description: xxx
### END INIT INFO
if [ "$1" = "start" ]; then
echo "log message"
//do stuff
fi
echo "$1"
if [ "$1" = "stop" ]; then
echo "log message"
//do stuff
fi
exit 0
stop
스크립트는 시작 중에 잘 실행되지만 블록에서 수행되어야 하는 정리가 수행되지 않는다고 불평합니다. 로그를 에코하면 $1
로그만 항상 표시됩니다 start
. 이는 OS가 분명히 stop
내 스크립트에 명령을 보내지 않는다는 것을 의미합니다. 인수를 사용하여 명령줄()에서 스크립트를 실행하면 sudo /etc/init.d/init.sh stop
매력처럼 작동하는데, 머신을 중지하면 왜 작동하지 않는지 혼란스럽습니다.start
stop
여기서 내가 어디서 잘못됐나요? 저는 Ubuntu 18.04를 실행 중이고 현재 실행 수준은 5입니다(그러나 여기서는 약 0과 6이어야 하므로 관련이 없습니다). 흥미롭게도 스크립트에 추가하여 실행 시 실제 런레벨을 확인해 보았는데 echo "$(who -r)"
로그에는 아무 것도 출력되지 않습니다!
sudo reboot
해당되는 경우: /rebooting 전달에 대해 이야기하고 있습니다.sudo systemctl reboot
그리고Azure GUI(가상 머신)를 통해 Azure의 다시 시작 메커니즘이 다른지 확실하지 않지만 두 방법 모두 작동하지 않습니다.
답변1
이전 런레벨 및 초기화 시스템을 대체한 systemd에 대해 알아야 합니다.
systemd는 여전히 이전 init.d 스크립트를 실행할 수 있지만 systemd를 배우고 systemd 서비스 파일을 작성하는 것이 좋습니다. 여기를 먼저 보세요systemd는 /etc/init.d 스크립트를 어떻게 사용합니까?, 여기서 systemd의 init.d 처리에 대한 설명을 찾을 수 있습니다.
내 생각 엔 systemd가 실행 중이라고 생각하지 않기 때문에 스크립트가 종료시 실행되지 않는 것 같습니다. 어쩌면 스크립트가 실행된 다음 종료되는 것일 수도 있습니다. 영원히 실행되지는 않습니다. systemd가 이를 감지하고 스크립트가 실행되지 않습니다. 있는 경우 실행되지 않습니다. 따라서 차단할 것이 없기 때문에 systemd는 이를 차단하지 않습니다.
systemctl 명령을 사용하여 서비스 상태를 확인하고 정보를 봅니다. systemctl
스크립트를 입력 하고 찾으면 됩니다. 당신은 또한 시도할 수 있습니다
systemctl status init.sh
systemctl start init.sh
systemctl stop init.sh
systemctl restart init.sh
이는 이전 init.d 스크립트가 아니라 실행되는 실제 명령입니다.
systemd로 마이그레이션하는 것이 좋습니다. 서비스 단위 구성 보기(https://www.freedesktop.org/software/systemd/man/systemd.service.html). 아마도 가장 좋은 서비스 유형은 입니다 oneshot
. 여기서 예를 찾을 수 있습니다.종료하기 전에 systemd를 사용하여 스크립트를 실행하는 방법은 무엇입니까?. examplelpe에 따르면 다음과 같은 것을 생성해야 합니다 /etc/systemd/system/init.sh.service
.
[Unit]
Description=init.sh
[Service]
Type=oneshot
RemainAfterExit=true
ExecStart=/etc/init.d/init.sh start
ExecStop=/etc/init.d/init.sh stop
[Install]
WantedBy=multi-user.target
그런 다음 systemd에서 서비스를 활성화하십시오.
sudo systemctl enable init.sh.service
서비스 시작 시점을 보다 정확하게 제어하려면 , 를 추가할 수 있습니다 After=
. Before=
다른 많은 옵션이 있습니다.
답변2
Required-Stop:
나는 문제가 가치의 부족이라고 생각합니다. 중지할 때 로거 및 디스크와 같은 다른 것을 실행할 필요가 없다고 말합니다. 해당 Required-Start:
줄 과 일치하도록 매개변수를 추가합니다 .
귀하의 이름은 더 설명적이어야 합니다. 표준 서비스 "init"가 있습니다. 이는 스크립트를 실행할 항목의 상위 서비스입니다.