저는 현재 시스템 시작/부팅 시 스크립트 실행과 크론 실행 init.d
의 차이점을 이해하려고 노력 중입니다.@reboot
사용 @reboot
(이 방법은 다음에서 사용됩니다.이 포럼통과찬드라)가 더 쉽습니다. 들어가서 crontab -e
하나를 생성 @reboot /some_directory/to_your/script/your_script.txt
하면 your_script.txt
시스템이 재부팅될 때마다 실행됩니다. 자세한 설명 @reboot
은여기
또는 삽입 /etc/init.d/your_script.txt
하여두 번째 줄귀하의 스크립트는 다음과 같습니다
#!/bin/bash
# /etc/init.d/your_script.txt
실행할 수 있으며 시스템이 시작될 때마다 실행되어야 합니다 chmod +x /etc/init.d/your_script.txt
.your_script.txt
- 둘 사이의 주요 차이점은 무엇입니까?
- 어느 것이 더 강합니까?
- 둘 중에 더 좋은 게 있나요?
- 부팅 중에 실행할 스크립트를 포함하는 올바른 방법입니까?
시작 중에 실행할 bash .sh 파일을 병합하겠습니다.
답변1
init.d
SysV 스크립트라고도 하며 시스템 초기화 및 종료 중에 서비스를 시작하고 중지하는 데 사용됩니다. ( /etc/init.d/
호환성을 위해 시스템이 활성화된 시스템에서도 스크립트를 실행할 수 있습니다.)
- 이 스크립트는 시작 및 종료 중에 실행됩니다(기본적으로).
- 스크립트는 단순한 스크립트가 아니라 init.d 스크립트여야 합니다.
start
그 이상을 지원해야 합니다stop
(참조:데비안 정책) - 스크립트를 실행할 수 있습니다.기간시스템이 시작됩니다(언제 정의할 수 있음).
crontab
(그러므로 @reboot
).
- cron은 일반적인 명령이나 스크립트를 실행하며 여기서는 특별한 것이 없습니다.
- 모든 사용자가
@reboot
스크립트를 추가할 수 있습니다(루트뿐만 아니라). - systemd가 있는 Debian 시스템에서는 cron의 @reboot가
multi-user.target
. - SysV(systemd 아님)가 있는 데비안 시스템에서 crontab(5)은 다음을 언급합니다:@reboot의 경우 cron(8) 데몬이 시작될 때 시작됩니다. 특히 일부 시스템 데몬이나 기타 기능이 시작되기 전일 수 있습니다. 이는 기계의 시동 순서 때문입니다.
- 시작할 때와 정기적으로 동일한 스크립트를 예약하는 것은 쉽습니다.
/etc/rc.local
종종 추악하거나 반대하는 것으로 간주됩니다(적어도빨간 모자), 하지만 여전히 몇 가지 좋은 기능이 있습니다.
- rc.local은 일반적인 명령이나 스크립트를 실행하며 여기서는 특별한 것이 없습니다.
- SysV(systemd 아님)가 있는 Debian 시스템: (
rc.local
거의) 마지막 서비스가 시작되었습니다. - 하지만 systemd가 있는 데비안 시스템에서는 기본적으로
rc.local
나중에 실행됩니다(아니요!)network.target
network-online.target
systemd network.target
및 에 대해 network-online.target
읽어보세요.네트워크 연결 후 서비스 실행.
답변2
먼저 다음 사항을 명확히 할 필요가 있습니다.
- 초기화 파일
httpd
예를 들어 서비스 제어 스크립트가 저장되는 디렉터리입니다. 제어 스크립트는 서비스의 시작과 중지를 제어할 수 있습니다.cron
- 로컬 파일시스템 시작 중에 임의의 스크립트를 실행할 수 있는 서비스입니다.
rc.local
스크립트를 사용하는 것과 스크립트를 실행하는 것 중 어느 것이 더 나은지에 대해서는 cron
실용성보다는 미학적 문제에 더 가깝다고 생각합니다. cron
작업 스케줄러로서 업데이트 확인, 캐시 지우기 또는 보안 감사 수행과 같은 시스템 유지 관리를 수행하는 방법으로 고안되었습니다. 이는 주어진 시간에 필요한 스크립트나 명령(예: )을 실행할 수 있으므로 이러한 기능 수행으로 제한된다는 의미는 아닙니다 @reboot
.
rc.local
반면에 사용법은 시스템 구성 유형 작업에 더 가깝습니다. 이는 rc.local
일반적으로 시스템의 네트워크 구성, 서비스 또는 환경 설정을 담당하는 시스템의 초기화 시스템에 의해 수행되기 때문입니다(다시 말하지만 이에 국한되지는 않음). 이 작업).
rc.local
그러나 모든 init 시스템이 메커니즘을 제공하는 것은 아니며 모든 cron 데몬이 @reboot
의사 표시를 제공하는 것은 아니라는 사실로 인해 두 가지 사항 모두 완화되어야 합니다 .
보너스 포인트
앞서 언급했듯이 init.d
이 디렉터리에는 시스템(적어도 SysV
init 유형 시스템을 사용하는 컴퓨터)에서 시작하거나 중지할 수 있는 서비스를 제어하는 스크립트가 포함되어 있습니다. 초기화 시스템과 스크립트 목적에 따라 스크립트를 다음으로 변환합니다.초기화 스크립트서비스와 동일한 방식으로 실행됩니다. 그러나 이러한 파일을 빌드하는 방법에 대한 프레임워크가 크게 다를 수 있으므로 이는 init 시스템에 따라 크게 달라집니다.
마지막 말
또한 일반적으로 bash 스크립트는 접미사 .sh
보다는 접미사 로 끝나는데 .txt
, 이는 해당 파일이 텍스트 파일이 아니라 쉘 스크립트임을 즉시 나타내기 때문입니다. 즉, 그것이 있는 한셰르본( #!/bin/bash
) 파일 상단에 있거나 는 bash /path/to/script.whatever
스크립트 실행에 중요하지 않습니다.
답변3
아래에 답변을 적습니다.
- 둘 사이의 주요 차이점은 무엇입니까?
위에서 다른 사용자가 언급한 차이점 외에도 @reboot가 crond 데몬에 의존한다는 점을 강조하고 싶습니다. crond가 시작되는 순서에 의존합니다. 대부분의 경우 crond는 잘 시작되지만 때로는 시작하지 못할 수도 있습니다(적어도 내 프로젝트 중 일부에서는 실패를 본 적이 있습니다). init 스크립트를 작성할 때 스크립트에서 뭔가 잘못하면 일반적으로 오류가 발생합니다(예: 서비스 이후에 시작되는 서비스에 의존).
- 어느 것이 더 강합니까?
위의 내용을 바탕으로 init이 더 강력하다고 생각합니다. 그런데 첫 번째 답변에서 '프랭클린 피아트'가 언급한 또 다른 점이 있다. 일반적으로 데몬에 대한 초기화 스크립트가 필요하며 다음 전략을 따라야 합니다.
- 둘 중에 더 좋은 게 있나요?
나는 그렇게 생각하지 않습니다(rc.local은 약간 오래되었고 더 이상 사용되지 않습니다)
- 부팅 중에 실행할 스크립트를 포함하는 올바른 방법입니까?
예. 일반적으로 애플리케이션/패키지 작성자가 이 작업을 수행합니다.