저는 bash에서 쉘 스크립트를 작성하고 있습니다. 스크립트의 어느 시점에서 계속하려면 시스템을 재부팅해야 함을 감지합니다. 다음을 방출합니다.
sudo reboot
머신이 다시 작동되면 스크립트는 더 많은 작업을 수행해야 합니다. 이 스크립트에서 작업을 계속하려면 어떻게 구성해야 합니까?
다음에 재부팅할 때 실행할 쉘 스크립트를 어딘가에 작성할 수 있다고 가정합니다. 그런 곳이 어디 있나요? cron에 @reboot 지시문이 있는 것을 보았습니다. 또한 Apache와 같은 서비스는 upstart에 의해 시작된다는 것도 알고 있습니다. 이러한 적절한 메커니즘이 있습니까? 그렇다면 어떻게 트리거합니까?
스크립트는 재부팅할 때마다 실행하는 것이 아니라 한 번만 실행하면 됩니다. 따라서 다음 재부팅 시에만 실행되거나 실행 후 자체를 삭제할 수 있는 위치로 이동해야 합니다.
이 문제다시 시작한 후 애플리케이션 상태를 저장하는 방법을 묻습니다. 내 스크립트에는 상태가 많지 않으므로 관리할 수 있습니다. 다음 재부팅 후에 실행되도록 이 스크립트를 얻는 방법만 알고 싶습니다.
내 특정 버전은 Ubuntu Linux 14.04입니다. 원래 스크립트는 시스템 관리자가 명령줄에서 시작합니다(cron에서 실행하는 대신).
답변1
시스템에 실제로 지속되는 유일한 것은 파일입니다. 이것은 당신이 사용해야 할 것입니다. 이는 init.d 스크립트를 사용하는 솔루션입니다.
다음 (간단한) 스크립트를 고려해 보겠습니다 /etc/init.d/myupdate
.
#! /bin/sh
### BEGIN INIT INFO
# Provides: myupdate
### END INIT INFO
PATH=/sbin:/bin:/usr/sbin:/usr/bin
case "$1" in
start)
/path/to/update/script
;;
stop|restart|reload)
;;
esac
로 활성화하면 시작 시 update-rc.d myupdate defaults
이 start
작업이 수행됩니다. 이제 업데이트 스크립트에서 재부팅을 요청하면 다음과 같이 하세요.
touch /var/run/rebooting-for-updates
sudo reboot
이 솔루션을 사용하면 업데이트 스크립트를 두 부분으로 나눌 수 있습니다.
before_reboot(){
# Do stuff
}
after_reboot(){
# Do stuff
}
if [ -f /var/run/rebooting-for-updates ]; then
after_reboot
rm /var/run/rebooting-for-updates
update-rc.d myupdate remove
else
before_reboot
touch /var/run/rebooting-for-updates
update-rc.d myupdate defaults
sudo reboot
fi
before_reboot
코드 섹션을 실행하고 에서 파일을 만든 /var/run
다음 다시 시작합니다. 시작 시 스크립트가 다시 호출되지만 파일이 존재하므로 after_reboot
대신 호출됩니다 before_reboot
.
update-rc.d
루트 권한이 필요하다는 점에 유의하세요 .
파일을 사용하지 마십시오(스티븐 오스터뮐러)의 의견:
이 유틸리티에 익숙하다면 getopts
파일 대신 옵션을 사용할 수도 있습니다. init 스크립트에서 다음 명령을 사용하여 스크립트를 호출합니다.
/path/to/update/script -r
스크립트에서 파일 대신 옵션을 확인하세요. 옵션 없이 스크립트를 한 번 호출하면 init.d는 시작 시 스크립트를 다시 호출합니다. 이번에는 -r
.
# Set AFTER_REBOOT according to options (-r).
if [ "x$AFTER_REBOOT" = "xyes" ]; then
# After reboot
else
# Before reboot
fi
옵션 처리에 대한 자세한 정보를 찾을 수 있습니다.여기(짧은 옵션만 해당). 또한 update-rc.d
(다른 댓글에서) 호출하여 일회성 작업으로 만들기 위해 스크립트를 편집했습니다 .