머신을 다시 시작한 후 스크립트 실행을 계속하려면 어떻게 해야 합니까?

머신을 다시 시작한 후 스크립트 실행을 계속하려면 어떻게 해야 합니까?

저는 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 defaultsstart작업이 수행됩니다. 이제 업데이트 스크립트에서 재부팅을 요청하면 다음과 같이 하세요.

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(다른 댓글에서) 호출하여 일회성 작업으로 만들기 위해 스크립트를 편집했습니다 .

관련 정보