처음 부팅 할 때만 스크립트를 실행하십시오


답변:


14

아니요. 그러나 스크립트를에 배치 /etc/init.d/script하고 자체 삭제하는 것이 좋습니다 .

#!/bin/bash

echo "Bump! I'm your first-boot script."

# Delete me
rm $0

, 참고하시기 바랍니다 $0Bash 전용 (버전> = 3)입니다. 호환성을 위해 대신 스크립트 파일 이름을 제공하여 덜 일반적으로 만들 수 있습니다.rm /etc/init.d/script
Andrejs Cainikovs

4
$ 0는 bash 특정이 아니며 bash 3.x보다 훨씬 오래 지원되었습니다 (Bourne, Korn, zsh 및 기타에서 지원됩니다). 고집 포인트는 $ 0에 전체 또는 상대 경로 사양이 포함되는지 여부입니다. 필요한 경우 전체 경로를 얻는 신뢰할 수있는 방법에 대한 링크는 다음과 같습니다. stackoverflow.com/questions/4774054/…
Jim Dennis

7

스크립트가 실행될 때 추적 파일을 작성하십시오. 파일이 이미 존재하면 스크립트를 종료하십시오.


4
언뜻보기에는 보이지 않지만 스크립트를 삭제하는 것보다 스크립트를 삭제하는 것보다 더 나은 솔루션 일 수 있습니다.
msanford

7

당신이 당신의 스크립트의 이름을 가정하면 처음 두 답변을 결합 /usr/local/bin/firstboot.sh의 마지막에 넣어 /etc/rc.local스크립트는 다음과 같이 간다 (부팅 할 때마다이 스크립트의 실행을)

#! / bin / bash

FLAG = "/ var / log / firstboot.log"
만약 [ ! -f $ FLAG]; 그때
   # 여기에 초기화 문장을 입력하십시오.
   echo "이것은 첫 번째 부팅입니다"

   # 다음 줄은 빈 파일을 만들어서 다음 부팅을 실행하지 않습니다
   $ FLAG를 터치
그밖에
   에코 "아무것도하지 마십시오"
fi

이것은 반드시 sysmtemd와 함께 작동하지는 않습니다. 마지막 스크립트 실행인지 확인하려면 절전 모드 20을 추가해야합니다.
mrossi

이름을 /etc/rc.local/99-firstboot.sh로 지정하면 마지막으로 실행해야합니다.
JohnDavid

3

잘 정의되고 지원되는 Ubuntu "first boot"후크를 검색 한 결과에 놀랐습니다. Red Hat / Fedora / CentOS 군중이 10 년 이상이 문제를 해결 한 것 같습니다. 가장 가까운 우분투는 oem-config-firstboot 인 것 같습니다 .

단순히 rm $0의지 를 수행한다는 아이디어 는 효과가 있습니다. 그러나 기술적으로 흥미로운 의미론이 있습니다. 유닉스에서 사용되는 대부분의 다른 스크립트 인터프리터와 달리 쉘 스크립트는 한 번에 한 줄 / 문을 읽고 처리합니다. rm파일 을 연결 해제 ( )하면 해당 스크립트를 처리하는 셸 인스턴스가 익명 파일 (열려 있지만 연결되지 않은 파일)과 함께 작동합니다.

다음과 같은 파일을 고려하십시오.

#!/bin/bash
rm $0
echo "I've removed myself: $0"
ls -l $0
cat <<COMMENTARY
   This is a test.
   I'm still here, because the "here" doc is being fed to 'cat'
   via the anonymous file through the open file descriptor.
   But I cannot be re-exec'd
COMMENTARY
exec $0

그것을 rmself.sh(하드)와 같은 것으로 저장하면 tst실행 ./tst하면 다음과 같은 결과가 출력으로 표시됩니다.

$ ./tst 
I've removed myself: ./tst
ls: ./tst: No such file or directory
   This is a test.
   I'm still here, because the "here" doc is being fed to 'cat'
   via the anonymous file through the open file descriptor.
   But I cannot be re-exec'd
./tst: line 11: /home/jimd/bin/tst: No such file or directory
./tst: line 11: exec: /home/jimd/bin/tst: cannot execute: No such file or directory

이제 심볼릭 링크와 스크립트가 간단한 이름으로 호출 된 경우 (쉘 $PATH이 스크립트 를 검색하도록 강제하는 경우)와 관련하여 몇 가지 가능한 모퉁이 사례가 있습니다.

그러나 bash(적어도 버전 3.2에서는) $0경로를 검색하면 경로 앞에 추가 되고 그렇지 않으면 $ 0을 스크립트를 호출하는 데 사용되는 상대 또는 절대 경로로 설정합니다. 정규화 또는 해상도 상대 경로 또는 심볼릭 링크를 수행하지 않는 것 같습니다.

아마도 우분투에서 가장 깨끗한 "firstboot"는 배치 할 스크립트 /etc/init.d/firstbootupdate-rc.d실행 레벨 1 ( /etc/rc1.d) 에 링크하는 데 사용 되는 설치 후 스크립트 (.deb 등)를 포함하는 작은 패키지 (.deb)를 만드는 것 update-rc.d firstboot defaults입니다. .. 그런 다음 마지막 줄에서 비활성화를 수행하거나 다음과 같은 것을 사용하여 삭제하십시오.update-rc.d firstboot disable

다음은 데비안 update-rc.d 하우투에 대한 링크입니다


0

현재 rc.local을 rc.local.bak에 백업 할 수 있습니다

그런 다음 rc.local에서 원하는 작업을 수행하고 결국 mv /etc/rc.loca.bak /etc/rc.local을 수행 할 수 있습니다.


0

문제는 EC2를 처음 부팅 할 때 스크립트를 실행하는 것에 관한 것입니다. cloud-init이 목적으로 사용할 수 있습니다 .

새로운 EC2 인스턴스를 시작할 때 당신은 정의 할 수있는 옵션이 User data아래를 Advanced datails. cloud-init스크립트를 거기에 두면 처음 부팅 할 때만 실행됩니다.

예를 들어 다음을 배치 할 수 있습니다 User data.

#cloud-config

runcmd:
  - /usr/bin/command1.sh
  - /usr/bin/command2.sh

출력은 /var/log/cloud-init-output.log

Cloud-init이보다 훨씬 더 많은 것을 할 수 있습니다. 특히 클라우드 인스턴스의 초기 초기화를 수행하도록 설계되었습니다. 여기 문서를 참조하십시오 : http://cloudinit.readthedocs.io/en/latest/index.html

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.