/etc/rc.local의 목적 및 일반적인 사용법


73

헤더는 다음과 같습니다 :

#!/bin/sh -e
#
# rc.local - executed at the end of each multiuser runlevel
#
# Make sure that the script will "exit 0" on success or any other
# value on error.

이 파일의 이유는 무엇입니까 (많은 내용이 포함되어 있지 않음). 일반적으로 어떤 명령을 넣습니까? "다중 사용자 실행 수준"이란 무엇입니까? ( rc"실행 명령"이라고 생각 하십니까?)


2
이것이 파일의 "공식적인"목적인지는 모르겠지만 시작시 발생해야하는 일에 파일을 사용할 수 있으며 암호를 제공 하지 않고도 수퍼 유저 액세스가 필요하다는 것을 알았습니다 . 일반적으로 색상, 키보드 및 기타 그러한 것들이 관련됩니다. 여기 에서 몇 가지 예를 확인 하십시오 .
Emanuel Berg

답변:


66

실행 수준은 그것이 부팅 또는 재부팅 또는 종료, 또는 단일 사용자 모드 또는 정상적으로 실행하는 과정에 있는지를 나타내는, 시스템의 상태이다. 기존의 init 프로그램은 해당 실행 레벨로 전환하여 이러한 조치를 처리합니다. Linux에서 런레벨 은 규칙에 따라 다릅니다 .

  • 부팅하는 동안 S
  • 종료하는 동안 0
  • 6 재부팅하는 동안
  • 단일 사용자 모드에서 1
  • 정상 작동시 2 ~ 5

런레벨 2에서 5까지는 시스템 관리자만을 대상으로하는 런레벨 1과 달리 여러 사용자가 로그인 할 수 있으므로 다중 사용자 런레벨이라고합니다.

실행 레벨이 변경되면 init는 rc 스크립트를 실행 합니다 (전통적인 init가있는 시스템에서 UpstartSystemd 와 같은 대안이 있습니다 ). 이 rc 스크립트는 일반적으로 시스템 서비스를 시작 및 중지하며 배포에서 제공합니다.

스크립트 /etc/rc.local는 시스템 관리자가 사용합니다. 일반적으로 모든 일반 시스템 서비스가 시작된 후 다중 사용자 실행 레벨로 전환하는 프로세스가 끝날 때 실행됩니다. 이를 사용하여 사용자 지정 서비스 (예 :에 설치된 서버)를 시작할 수 있습니다 /usr/local. 대부분의 설치는 필요하지 않으며 /etc/rc.local, 필요한 경우의 소수를 위해 제공됩니다.


2
나는 오늘 FreeBSD에서 rc.local이 꽤 일찍 실행될 수 있음을 알았습니다. 모든 정상적인 시스템 서비스가 시작된 후에는 확실하지 않습니다. 헤드리스 머신에 대한 sshd 액세스가 가능 해졌을 때 경고음을 원했고 rc.local이러한 이유로 적합하지 않았습니다. 원래 질문은 데비안에 관한 것이기 때문에이 의견은 아마도 OP와 관련이 없을 것입니다.
MvG

1
@MvG 정보를 주셔서 감사합니다. rc.local전통적으로 마지막으로 실행되었지만 FreeBSD가 종속성 기반 시스템으로 전환했을 때 그 작업을 중단 한 것으로 나타났습니다. rc.local이후에 호출 된 경우에도 /etc/rc.d/sshd완벽하게 작동하지 않습니다 rc.local. sshd프로세스가 시작된 직후에 호출 될 수 있습니다 sshd. 네트워크를 청취 하기 전에 호출 될 수 있습니다 (그러나 우리는 10 분의 1 초에 이야기하고 있습니다) 가장 일반적인 설정에서).
Gilles

나는 그것을 사용하여 lxc 컨테이너에 대한 네트워크를 설정하고 자동 시작하려고합니다. 그러나 이후에 멈 춥니 다 iptables-apply /root/iptables. 무엇이 잘못되었는지 파악하는 중입니다 (다음 재부팅을 기다리는 중). 그러나 당신이 어떤 제안을 가지고 있다면, 나는 모두 귀입니다.
x-yuri

1
@ x-yuri 여기에 게시 한 것보다 더 많은 정보가 필요합니다. 나는 "그것"이 "그만"에 무엇인지조차 모른다. 당신이 한 일을 설명하는 새로운 질문을하십시오.
Gilles

14

rc "실행 제어"를 나타냅니다.

multiuser실행 레벨은 네트워킹이 가능하고, 따라서 서버에 연결이 하드 유선 콘솔 연결 대신에 그 서비스를 사용 할 수있다하는 수준으로 정의된다.

서버는 일반적으로 네트워크 연결을 지원하고 실제로 유선 콘솔이있는 것처럼 작동하는 서비스 프로세서 (다양한 이름으로)에 의해 관리됩니다.

에 관해서는 rc.local파일이 당신이 "로컬"(사이트 별) 객체 (데몬 및 / 또는 한 번에 부팅 스크립트) 시작하려는 모든 지정할 수 있도록하는 편리하다. 이 패러다임을 사용하거나 실제로 시작 / 중지 스크립트로 '/etc/init.d'를 적절하게 채울 수 있습니다.


1
좋아, 그러나 왜 파일이 ​​거기에 있으며, 일반적으로 언제 사용하며 어떻게 (예를 들어 어떤 명령을 넣는 것이 의미가 있는가)?
Emanuel Berg

4

나는 주로 두 가지 용도로 사용합니다.

  1. 재부팅 할 때마다 날짜와 커널 버전을 기록합니다. 간단한 한 줄짜리 라이너로 채워 넣지 않고도 시스템에 쉽게 추가 할 수 있으며 실행하는 것보다 부팅 기록이 손상되는 경향이 훨씬 적습니다 uptimed.

  2. 몇 년 전까지 데비안에서 사용하던 이전 /etc/rc.boot/ 디렉토리를 되살리려 고합니다. 나는 여전히 init.d 스크립트로 다시 쓸만한 가치가없는 간단한 스크립트를 가지고 있습니다 (예 : dmesg를 루트로 메일로 보내는 Q & D 스크립트, hdaparm을 사용하여 유휴 스핀 다운 및 blockdev를 비활성화하여 읽기 설정) 앞으로 크기), 나는 다른 모든 부팅 시간 스크립트 후에 실행하게되어 기쁩니다.

예 :

echo "$(date +%s),$(date),$(uname -a)"  >> /var/log/reboot.log

[ -d /etc/rc.boot ] && run-parts /etc/rc.boot

또한, 나는 OpenStack은에서 (의 EC2 스타일의 메타 데이터를 얻을 수 CentOS는 데비안 배포판을 위해 올해 초 /etc/rc.local에 스크립트를 작성 http://169.254.169.254/VM이 자신의 IP, 호스트 이름, SSH 키, 그리고 다른 인스턴스 특정 정보를 얻을 것이다 그래야) . cloud-init는이 배포판으로 포팅되었으므로 이제 스크립트가 더 이상 사용되지 않습니다.


3

데비안rc.local파일 은 대부분 비 초기 스타일 시스템과 호환됩니다. 사용해서는 안됩니다.

대신, /etc/init.d/Skeleton런레벨을 변경하는 동안 발생하는 모든 작업에 대해 새로운 init 스크립트에 복사 한 다음이를 사용 inserv하여 사용하는 것이 좋습니다.


업데이트 : 아래 의견에 따라이 답변은 더 이상 권장되지 않습니다. 그러나이 답변은 스켈레톤 지원 중단 몇 년 전에 게시 되었으며 해당 스켈레톤 2019 년 1 월 현재 데비안에 불안정합니다.


unix.stackexchange.com/a/480897/5132 /etc/init.d/skeleton 는 그렇지 않습니다.
JdeBP
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.