rc.local을 다시 만드는 대신 systemd에서 rc.local을 올바르게 대체하는 것은 무엇입니까?


25

systemd에서 일부 로컬 스크립트 (또는 매우 로컬 명령) 를 실행하는 올바른 방법을 찾을 수 없습니다. 이러한 종류의 스크립트에 대해 서비스 (시스템 단위로)를 작성해서는 안된다는 것을 이미 알고 있습니다.

내가 찾은 해결 방법은 rc.local을 만들고 실행 권한을 부여하는 것입니다.

printf '#!/bin/bash \n\nexit 0' >/etc/rc.local 
chmod +x /etc/rc.local

예를 들어 간단한 rc.local을 사용하여 레거시 서버를 구성하면 rc.local은 외부에서 존경을 받았기 때문에 수행 한 작업과 배포판에 새로운 것을 업그레이드하거나 설치하는 데 얼마나 많은 피해를 입을 지 알 것입니다 반면에 간단한 작업을 수행하기 위해 서버를 설치하고 시스템 단위 또는 2 ~ 3 개 (또는 sysvinit 서비스)를 만들면 때로는 인생을 어렵게 만들 수 있습니다. names는 언젠가 배포 개발에 의해 생성 된 새 서비스의 이름과 충돌 할 수 있으며 업그레이드에 설치되어 스크립트에 문제를 일으킬 수 있습니다!

내가 볼 다른 질문 에 대해 물어 rc.local 파일입니다 하고 대답은 내 질문은 정말 생각을 만들고 실행 권한을 부여하는 것이었다 하지 중복 이 어디 있는지 알고 싶어하지 않기 때문에, - 날 믿어, 난 그냥 원하는 에 동의 가되어 사용되지 않는 ,하지만 난 사물의 종류의 일을위한 올바른 방법을 찾을 수없는, 정말 그냥 같은 몇 가지 간단한에 대한 단위를 생성해야합니까?


4
체계화 된 "유일한 승리의 움직임은 플레이하지 않는 것"; 또는 원하는 내용에 따라 시스템 단위를 만들 수 있습니다. 아마도 지금은 rc.local을 사용하고 사라질 때 걱정할 것입니다.
Rui F Ribeiro

공식적인 방법은 서비스와 같은 단위를 만드는 것이라고 생각하십니까? 그렇게하는 방법에 대한 답변으로 게시하십시오.
Luciano Andress Martini

1
Ubuntu를 사용해 보았을 때 재부팅하지 않은 상태에서 데스크톱에 영구 ssh-agent 캐싱을 수행하기위한 장치를 만들었고 기억할 수없는 다른 장치를 만들었습니다. /etc/rc.local을 가리키는 하나를 만들 수도 있지만 시스템이 지금 자신을 위해하고있는 것처럼 보입니다 .... 나는 당분간 rc.local을 할 것입니다. 그런 다음 /etc/rc.local
Rui F Ribeiro

이것은 일부 책에서 /etc/rc.local에 무언가를 넣어야한다고 말하는 것처럼 설명서를 깨뜨릴 수 있습니다. 예를 들어 rc.local이 완전히 사용되지 않을 때 실행 가능으로 표시되어야한다고 말하는이 문서를 업그레이드하려고합니다 설명서가 손상되었지만 /etc/rc.local을 가리 키도록 장치를 만들어야한다고하면 systemd가 장치와 충돌하기 때문에 설명서가 손상되었습니다. 나는 당신이 옳다면, 그들이 대체물을 가지고 있지 않기 때문에 더 이상 사용되지 않을지 여부를 결정하지 않았을 것입니다 ... 모든 문서가 다시 깨질 것이라고 결정할 때.
Luciano Andress Martini

어떤 종류의 스크립트를 실행해야합니까? Systemd에는 많은 단위 유형이 있습니다. "서비스"는 많은 단위 유형 중 하나 일뿐 입니다. 예 : 마운트 유닛, 자동 마운트 유닛, 타이머 유닛, 대상 유닛. 그들 중 하나가 문제를 해결할 수 있습니까?
andcoz

답변:


17

다른 곳에서 지적했듯이 rc-local.service아래 에서 사용하는 것은 적당하지 않습니다 systemd.

  1. 이론적으로는 배포가 활성화되지 않을 수 있습니다. (예를 들어 동일한 빌드 옵션을 비활성화하면 많은 사람들이 사용하는 poweroff/ reboot명령 도 제거되기 때문에 이것이 일반적이지 않다고 생각 합니다).
  2. 의미론이 완전히 명확하지는 않습니다. Systemd는 rc-local.service한 가지 방법을 정의 하지만 데비안은 하나 이상의 중요한 설정을 변경하는 드롭 인 파일을 제공합니다.

rc-local.service종종 잘 작동 할 수 있습니다. 당신이 위의 것을 걱정한다면, 당신이해야 할 일은 자신의 사본을 만드는 것입니다! 여기 마술이 있습니다 :

# /etc/systemd/system/my-startup.service
[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/usr/local/libexec/my-startup-script

[Install]
WantedBy=multi-user.target

모든 세부 사항을 이해할 필요는 없다고 생각하지만 [*] 여기서 알아야 할 두 가지가 있습니다.

  1. 로 활성화해야합니다 systemctl enable my-startup.service.

  2. 스크립트가를 포함하여 다른 서비스에 종속 된 경우 network-online.target이를 선언해야합니다. 예 [Unit]를 들어 라인 Wants=network-online.target과 으로 섹션을 추가하십시오 After=network-online.target.

    "이른 부팅"서비스, 특히 이전에 이미 주문한 서비스에 대한 종속성에 대해 걱정할 필요가 없습니다 basic.target. 같은 서비스 my-startup.servicebasic.target설정하지 않으면 자동으로 주문 됩니다 DefaultDependencies=no.

    종속성 중 하나가 "early boot"서비스인지 확실하지 않은 경우, 한 가지 방법은을 basic.target실행하여 이전에 주문한 서비스를 나열 하는 것 systemctl list-dependencies --after basic.target입니다. (이 --after아닌 --before).

사전 시스템에 적용 된 것으로 생각되는 몇 가지 고려 사항이 있습니다 rc.local.

  1. 명령이 동일한 것을 제어하려는 다른 프로그램과 충돌하지 않는지 확인해야합니다.
  2. 에서 실행되는 장기 실행 프로그램을 시작하지 않는 것이 가장 좋습니다 rc.local.

[*] Type=oneshot+ RemainAfterExit=yes는 대부분의 원샷 스크립트에 더 적합하기 때문에 +를 사용 했습니다. 일련의 명령을 실행하며, 명령 my-startup이 완료되면 "활성"으로 표시되고 데몬을 시작하지 않도록 공식화합니다 .


글쎄, 서비스 나 스 니펫을 만들 수있는 일종의 "로컬"장소가 있습니까? 내 데몬을 개발한다면? 나는 시스템의 독창성을 변경하고 싶지 않기 때문에 apt-get을 설치할 때 대체 된 스크립트 또는 이와 같은 것으로 인해 내 시스템을보고 싶지 않습니다. 난 단지 데몬이 한번만 시작될 것이라는 것을 믿고 싶다. 내가 망가 뜨린 것처럼 다시 시작하려고하는 등 미친 짓을하는 것 등 ...
Luciano Andress Martini

1
@LucianoAndressMartini 데몬을 시작하는 올바른 방법이 무엇인지 묻는다면 실제로 개별 서비스를 정의해야합니다. 기본 시스템 .service단위이거나 LSB init 스크립트를 작성하려는 경우 대신 수행 할 수 있습니다. 여러 데몬을 rc-local.service넣거나 그와 동등한 것을 권장하지는 않았지만 아마도 효과가 있다고 생각하지만 개별 데몬을 다시 시작할 수 있으면 훨씬 좋습니다.systemctl restart my-daemon 다른 것과 마찬가지로 . 지역 서비스를에 배치하기위한 것입니다 /etc/systemd/system.
sourcejedi

1
@LucianoAndressMartini 당신은 sysvinit처럼 다른 서비스와 같은 이름을 사용하지 않아야합니다. 비슷한 상황에서 나는 때때로 내 이름을 시작했습니다 local-...
sourcejedi

1
고맙습니다!!! 반나절 후에 저장되었습니다. Type = oneshot, RemainAfterExit = yes, Wants = network-online.target, After = network-online.target과 같은 세부 정보가 나에게 중요했습니다. 아파치 빌드를 배포하고 고정 IP를 192.168.1.80으로 설정하면 라우터가 트래픽을 전달할 수 있습니다. 사소해야합니다. 데비안 9에서는 성가시다. "apt-get apache", "systemctl start apache"또는 init.d의 지침을 제외한 온라인 조언은 거의 없으며 Debian9에서 소스 빌드 된 Apache에는 적용되지 않습니다.
MichaelsonBritt

1
@MichaelsonBritt rc.local에서 장시간 실행되는 프로그램 인 데몬을 시작하지 않는 것이 가장 좋습니다. 나는 Type=oneshot... 당신은 데몬을 시작하지 않을 것이라고 공식화했다. 데몬 시작에 대한 정보가 필요하면 새로운 질문을하십시오.
sourcejedi

15

에 대해 잊어 버리십시오 rc.local.

마찬가지로 나는 CentOS는 7에 대해 말했다데비안 (8)에 대한우분투 (15)에 대해 :

systemd + Linux 운영 체제를 사용하고 있습니다. /etc/rc.local이는 van Smoorenburg System 5 rc클론의 호환성 메커니즘 인 메커니즘에 대한 이전 버전과의 호환성 메커니즘이기 때문에 systemd의 이중 역 호환성 메커니즘입니다 .

사용 /etc/rc.local은 끔찍하게 잘못 될 수 있습니다. 사람들은 systemd가 rc.local예전처럼 부트 스트랩의 동일한 위치에서 완전히 같은 방식으로 실행되지 않는다는 사실에 놀랐습니다 . (또는 잘못 예상 : 실제로 실행되지 않았습니다. 마지막 . OpenBSD의 설명서는 여전히 지적으로, 기존 시스템에서) 다른 사람이 자신들이 설정 한 어떤 사실에 의해 놀라게 한 rc.local일을하는 기존의 방법을 기대한다 다음 완전히 새로운의 좋아하는에 의해 취소 udev규칙, 네트워크 매니저, systemd-logind, systemd-resolved, 또는 다양한 "키트"의.

" 'init 0'으로 인해" 아키 설치에 "과도한 인수"가 발생하는 이유는 무엇입니까? "로 예시 된 것처럼 일부 운영 체제는 이미 발전기 와 같은 이전 버전과의 호환성 기능 없이 시스템을 제공 합니다systemd-rc-local-generator . 데비안은 아직 호환성이 특징 뒤쪽을 유지하는 동안 , 그들을 해제와 아치 리눅스는 systemd 빌드 . 따라서 아치 및 운영 체제에서는 /etc/rc.local 완전히 무시 될 것으로 예상 됩니다 .

에 대해 잊어 버리십시오 rc.local. 갈 길이 아닙니다. systemd + Linux 운영 체제가 있습니다. 따라서 적절한 시스템 서비스 단위를 만들고 이전 버전과의 호환성이 두 가지 수준 인 지점부터 시작하지 마십시오. (우분투와 페도라에서는 반 스무 렌 버그 시스템 5 클론 이 3 번 제거되었으며, rc그 이후 10 년 전에 처음 시작하여 시스템에 의해 두 번 대체 rc.local되었습니다 .)

또한 systemd로 마이그레이션하기위한 첫 번째 규칙을 기억 하십시오 .

이것은 체계화 된 새로운 아이디어조차 아닙니다. van Smoorenburg rc및 Upstart 시스템에서해야 할 일은 사용하지 않고 적절한 van Smoorenburg rc스크립트 또는 Upstart 작업 파일을 만드는 것 rc.local입니다. 요즘에는 적절한 Mewburn을 생성한다는 FreeBSD의 매뉴얼 노트조차도rc 을 사용하는 대신 스크립트를/etc/rc.local . Mewburn rc은 NetBSD 1.5에서 2000 년에 소개되었습니다.

/etc/rc.localSeventh Edition Unix의 시대와 그 이전의 날짜. 1983 년 에 AT & T Unix System 3 ( AT & T Unix System 5 와 약간 다름) 으로 대체되었으며 /etc/inittab런레벨 기반rc/etc/inittab . 심지어 그것은 지금 역사이다.

nosh 툴셋을위한 서비스 번들 service-manager및 Mewburn을 system-control위한 /etc/rc.d/스크립트 이든 서비스 관리 시스템에 적합한 고유 한 서비스 정의를 작성하십시오.rc , systemd의 서비스 단위 파일, Upstart의 작업 파일, runit / s6 / daemontools의 서비스 디렉토리 등 -encore 또는 /etc/init.d/van Smoorenburg 용 스크립트 rc.

시스템에서 이러한 관리자 추가 서비스 단위 파일은 /etc/systemd/system/일반적으로 (또는 /usr/local/lib/systemd/system/거의) 들어갑니다. nosh 서비스 관리자 /var/local/sv/는 로컬 서비스 번들을위한 일반적인 장소입니다. rcFreeBSD의 Mewburn 은을 사용합니다 /usr/local/etc/rc.d/. 패키지화 된 서비스 단위 파일 및 서비스 번들을 작성하는 경우 다른 위치로 이동하십시오.

추가 자료


2
@LucianoAndressMartini 더 나은 질문은 시스템 서비스에서 rc.local의 특정 스 니펫을 처리하는 방법입니다. 따라서 특정 스 니펫을 염두에두고 (일부 소프트웨어 설명서의 지침을 언급하면) 그에 대한 질문을 게시 할 수 있습니까? 변환에 사용할 수있는 일반적인 규칙이 있지만 실행중인 소프트웨어의 기능 (예 : 포 그라운드에서 실행, 데몬을 제거하지 않는 등)을 활용하여 특정 사례를 묻 으면 더 많은 이점을 얻을 수 있습니다. 도움이 될 수 있습니다.
filbranden

4
1983 년 이래로 더 이상 사용되지 않더라도 궁금 할 것입니다.
Dan 카터

4
이 대답은 설교이며 실제로 "무엇을해야합니까?"라는 간단한 질문에 대답하지 못합니다. 정보를 포함하고 많은 참조를 제공 할 수 있지만 스택 교환의 목적을 무효화합니다.
gps

나는 리눅스가 진화하지 않는 이유 때문에 dns 해결 문제와 함께 이것 (rc.local의 끝)을 가져 오지만 실제로 점점 더 스파게티 코드가되어 systemd는 많은 사람들에게 블랙 박스가되었습니다. 사용자 나 관리자가 rc.local에 무언가를 넣고 싶지만 더 이상 할 수없는 경우, 몇 분이 아닌 며칠 만에 동일한 최종 결과를 달성하기 위해 먼저 체계화 된 코스 나 다른 설교를하도록 강요하는 것이 도움이되지 않습니다. 물론 바보는 잘 작동하고 다루기 쉬운 모든 것을 바보 같은 일을 할 수 있습니다.
Julius

2

https://www.linuxbabe.com/linux-server/how-to-enable-etcrc-local-with-systemd 요약

/etc/systemd/system/rc-local.service를 작성하십시오.

# /etc/systemd/system/rc-local.service
[Unit]
 Description=/etc/rc.local Compatibility
 ConditionPathExists=/etc/rc.local

[Service]
 Type=forking
 ExecStart=/etc/rc.local start
 TimeoutSec=0
 StandardOutput=tty
 RemainAfterExit=yes
 SysVStartPriority=99

[Install]
 WantedBy=multi-user.target

그때:

sudo touch /etc/rc.local
sudo chmod +x /etc/rc.local
sudo systemctl enable rc-local

확인 :

sudo systemctl start rc-local.service
sudo systemctl status rc-local.service

시스템에서 제공하는 용도 StandardOutput=journal+console(콘솔은 예제에서 tty와 동일)로 문제 해결에 훨씬 유용한 것으로 보입니다. 또한 SysVStartPriority=어느 시점에서 지원 이 제거되었습니다. 어쩌면 당신은 얼마나 중요한지 언급 SysVStartPriority=하거나 제거 할 수 있습니다. 그 외에도 괜찮은 대답입니다.
sourcejedi
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.