컴퓨터를 재부팅 한 후 스크립트를 계속 진행하는 방법은 무엇입니까?


18

bash에서 쉘 스크립트를 작성 중입니다. 스크립트의 어느 시점에서, 계속하기 전에 머신을 재부팅해야 함을 감지합니다. 그것은 발행한다 :

sudo reboot

기계가 다시 작동하면이 스크립트에 필요한 작업이 더 있습니다. 이 스크립트에서 작업을 계속하도록 구성하려면 어떻게해야합니까?

쉘 스크립트를 작성하여 다음에 다시 부팅 할 때 실행될 수있는 곳이 있다고 가정합니다. 그런 곳은 어디입니까? cron에 @reboot 지시문이 있음을 알았습니다. 또한 Apache와 같은 서비스는 부팅 할 때 시작시 시작된다는 것도 알고 있습니다. 이들 중 하나가 적절한 메커니즘일까요? 그렇다면 어떻게 트리거됩니까?

이 스크립트는 모든 재부팅이 아니라 한 번만 실행하면됩니다. 따라서 다음에 다시 부팅 할 때 실행되는 곳으로 이동하거나 일단 실행되면 스스로 제거 할 수 있어야합니다.

이 질문 은 재부팅 후 애플리케이션 상태를 저장하는 방법에 대해 묻습니다. 내 스크립트에는 상태가별로 없으므로 관리 할 수 ​​있습니다. 다음 스크립트를 다시 부팅 한 후이 스크립트를 실행하는 방법을 알아야합니다.

내 특정 버전은 Ubuntu Linux 14.04입니다. 원래 스크립트는 시스템 관리자가 명령 행에서 시작합니다 (cron에서 실행하는 것과 대조적으로).


스크립트 내에서 재부팅하는 것은 피할 수없는 경우에만 사용해야합니다. 예를 들어 새로운 커널 설치. 재부팅하지 않아도 작업을 수행 할 수 있습니다. 재부팅이 필요한 이유를 지정할 수 있습니까?
혼돈

1
이 스크립트는 새로운 커널을 설치합니다 (또는 오히려 업그레이드를 호출합니다). 또한 재부팅 전에 실제로 재부팅이 필요한지 확인합니다.
Stephen Ostermiller

"스크립트 내에서 재부팅하는 것은 피할 수없는 경우에만 사용해야합니다." -@chaos 왜?
John Red

답변:


16

시스템에서 실제로 지속되는 유일한 것은 파일입니다. 그것은 당신이 사용해야 할 것입니다. 다음은 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루트 권한 이 필요합니다.

파일을 사용하지 않고 ( Stephen Ostermiller 의 의견에서) :

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이 작업을 한 번만 유지하기 위해 다른 주석에서 스크립트를 편집했습니다 .


2
의 존재에 의존하기보다는 전화 /path/to/update/script --after-reboot하는 /etc/init.d/myupdate것이 더 간단 할 수 있습니다 /var/run/rebooting-for-updates. 그러면 직접 실행할 때와 부팅 할 때 호출 될 때 다른 인수를 갖게됩니다.
Stephen Ostermiller

좋은 점은 옵션에 대해 생각하지 않았습니다. ;)
John WH Smith

1
또한 일회성 작업이므로 스크립트 자체 update-rc.d myupdate defaultsupdate-rc.d myupdate remove에 스크립트 를 추가하고 /etc/init.d/myupdate파일을 작성하거나 제거하여 파일을 남기지 않도록 하고 싶습니다 .
Stephen Ostermiller

나는 이것을 구현했고 잘 작동한다. 내가 추가 할 유일한 것은 데비안 기반 시스템의 INIT INFO섹션에 추가 항목이 필요하다는 것입니다 . wiki.debian.org/LSBInitScripts
Stephen Ostermiller

정말 간단하게 유지하고 싶었습니다.) 적절한 init.d를 작성하는 데 약간의 시간이 걸리지 만 더 자세한 정보를 찾아 보니 기쁩니다.이 스크립트는 매우 유용 할 수 있습니다.
존 WH 스미스
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.