/etc/rc.d/rc.local 은 SysV 시절 부팅 마지막에 실행되던 스크립트다. systemd 는 호환을 위해 rc-local.service 를 두지만, 파일에 실행 권한이 있을 때만 자동으로 켜진다. RHEL 8 이상에서도 동작하나 새로 만드는 부팅 작업은 rc.local 대신 systemd 유닛으로 쓰는 편이 낫다. 순서 · 의존성 · 실패 처리를 지정할 수 있기 때문이다.
sudo chmod +x /etc/rc.d/rc.local
RHEL 계열은 /etc/rc.local 이 /etc/rc.d/rc.local 의 심볼릭 링크다. 파일이 없으면 만들고 첫 줄에 셔뱅을 넣는다.
sudo tee /etc/rc.d/rc.local >/dev/null <<'SCRIPT'
#!/bin/bash
# 부팅 후 실행할 명령을 여기에 적는다
SCRIPT
sudo chmod +x /etc/rc.d/rc.local
sudo systemctl enable --now rc-local.service
sudo systemctl status rc-local.service
rc-local.service 는 배포판 패키지에 들어 있다. 단위 파일이 없다는 오류가 나면 다음처럼 만든다. 원래 기록은 /usr/lib/systemd/system/ 아래 파일에 [Install] 절만 덧붙였는데, 그 경로는 패키지 소유라 업데이트 때 덮인다. 사용자 정의는 /etc/systemd/system/ 에 둔다.
sudo tee /etc/systemd/system/rc-local.service >/dev/null <<'UNIT'
[Unit]
Description=/etc/rc.d/rc.local Compatibility
ConditionFileIsExecutable=/etc/rc.d/rc.local
After=network-online.target
Wants=network-online.target
[Service]
Type=forking
ExecStart=/etc/rc.d/rc.local start
TimeoutSec=0
RemainAfterExit=yes
[Install]
WantedBy=multi-user.target
UNIT
sudo systemctl daemon-reload
sudo systemctl enable --now rc-local.service
systemctl is-enabled rc-local.service
journalctl -u rc-local.service -b
재부팅 뒤 스크립트에 적은 명령의 결과(파일 생성, 프로세스 기동 등)를 확인한다. rc.local 은 부팅의 아주 늦은 시점에 한 번 돌 뿐이라, 실패해도 부팅은 계속된다.