답변:
아니요. 그러나 스크립트를에 배치 /etc/init.d/script
하고 자체 삭제하는 것이 좋습니다 .
#!/bin/bash
echo "Bump! I'm your first-boot script."
# Delete me
rm $0
당신이 당신의 스크립트의 이름을 가정하면 처음 두 답변을 결합 /usr/local/bin/firstboot.sh
의 마지막에 넣어 /etc/rc.local
스크립트는 다음과 같이 간다 (부팅 할 때마다이 스크립트의 실행을)
#! / bin / bash FLAG = "/ var / log / firstboot.log" 만약 [ ! -f $ FLAG]; 그때 # 여기에 초기화 문장을 입력하십시오. echo "이것은 첫 번째 부팅입니다" # 다음 줄은 빈 파일을 만들어서 다음 부팅을 실행하지 않습니다 $ FLAG를 터치 그밖에 에코 "아무것도하지 마십시오" fi
잘 정의되고 지원되는 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/firstboot
와 update-rc.d
실행 레벨 1 ( /etc/rc1.d
) 에 링크하는 데 사용 되는 설치 후 스크립트 (.deb 등)를 포함하는 작은 패키지 (.deb)를 만드는 것 update-rc.d firstboot defaults
입니다. .. 그런 다음 마지막 줄에서 비활성화를 수행하거나 다음과 같은 것을 사용하여 삭제하십시오.update-rc.d firstboot disable
다음은 데비안 update-rc.d 하우투에 대한 링크입니다
문제는 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
$0
Bash 전용 (버전> = 3)입니다. 호환성을 위해 대신 스크립트 파일 이름을 제공하여 덜 일반적으로 만들 수 있습니다.rm /etc/init.d/script