잊어 버려 rc.local...

잊어 버려 rc.local...

나는 어떤 일을 하는 올바른 방법을 찾을 수 없다현지의systemd의 스크립트(또는 매우 로컬 명령), 나는 그러한 스크립트에 대한 서비스(systemd의 단위로)를 생성할 수 없다는 것을 이미 알고 있습니다(또는 생성해야 합니까?)....

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

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

예를 들어, 귀하가 간단한 rc.local을 구성한 오래된 서버를 가지고 있다면, 귀하가 무엇을 했는지, 그리고 rc.local이 외부 패키지에서 존중되기 때문에 배포판에 새로운 것을 업그레이드하거나 설치하는 것이 얼마나 해로울지 알 수 있습니다. , 그러나 반면에 간단한 작업을 완료하기 위해 서버를 설치하고 시스템 장치 한두 개 또는 세 개(또는 심지어 sysvinit 서비스)를 만드는 경우 이는 때때로 여러분의 삶을 훨씬 더 복잡하게 만들 수 있습니다. 내 유닛 이름보다 어려운 것은 언젠가 배포 개발에서 생성되고 업그레이드 시 설치될 수 있는 새로운 서비스의 이름과 충돌하여 내 스크립트에 문제를 일으킬 수 있습니다!

이해합니다또 다른 문제묻다rc.local은 어디에 있나요?대답은 그것을 만들고 실행 권한을 부여하는 것입니다. 내 질문은 실제로아니요복사, 왜냐하면 저는 그것이 어디에 있는지 알고 싶지 않기 때문입니다. 제 말을 믿으세요. 저는 단지 알고 싶을 뿐입니다.수용하다이것은더 이상 사용되지 않음그런데 이런 일을 제대로 할 수 있는 방법을 찾을 수 없는데, 이런 간단한 일을 위해서 정말 유닛을 만들어야 할까요?

답변1

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.targetAfter=network-online.target

    Early Start 서비스, 특히 이미 구독한 서비스에 대한 종속성에 대해 걱정할 필요가 없습니다 basic.target. 이러한 서비스는 설정되지 않는 한 my-startup.service나중에 자동으로 순서가 지정됩니다 .basic.targetDefaultDependencies=no

    종속성 중 하나가 "조기 시작" 서비스인지 확실하지 않은 경우 한 가지 접근 방식은 를 basic.target실행하여 이전에 주문한 서비스를 나열하는 것입니다 systemctl list-dependencies --after basic.target. (예 --after, 아니오 참고 --before).

pre-systemd에도 적용되는 몇 가지 고려 사항이 있다고 생각합니다 rc.local.

  1. 동일한 명령을 제어하려는 다른 프로그램과 명령이 충돌하지 않는지 확인해야 합니다.
  2. 따르지 않는 것이 가장 좋습니다 rc.local.

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

답변2

잊어 버려 rc.local...

~처럼CentOS 7에 대해 이야기하고 있습니다.그리고데비안 8 소개그리고우분투 15 소개:

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

/etc/rc.local심각한 오류가 발생할 수 있습니다 . 사람들은 rc.local부트로더의 동일한 위치인 systemd가 실행되는 방식이 이전과 다르다는 사실에 놀랐습니다 . (또는 실수로 예상: 실제로 실행되지 않습니다.마지막OpenBSD 매뉴얼에는 여전히 명시되어 있습니다. ) 다른 사람들은 이전 작업 방식을 예상하여 만든 것이 rc.local새로운 udev규칙, NetworkManager systemd-logind, systemd-resolved또는 다양한 "스위트"로 대체되는 것에 놀랐습니다.

"https://unix.stackexchange.com/questions/389289/"에 표시된 것처럼 일부 운영 체제는 이미 systemd를 제공합니다.아니요이전 버전과의 호환성 기능systemd-rc-local-generator발전기 와 같은. 동시에 데비안은 여전히 ​​이전 버전과의 호환성 기능을 유지합니다.,Arch Linux를 빌드할 때 systemd를 끄십시오.. 따라서 Arch와 그것이 기대하는 운영 체제에서는/etc/rc.local 완전히 무시됨.

잊어 버려 rc.local... 이것은 갈 길이 아닙니다. systemd+Linux 운영 체제가 있습니다. 따라서 적절한 시스템 서비스 단위를 만들고 이전 버전과의 두 가지 수준의 호환성이 아닌 다른 지점에서 시작하지 마십시오. (우분투와 페도라에서는여러 번 삭제한 후 후속 van Smoorenburg System 5 rc클론이 rc.local삭제되었습니다.그 자체를 두 번10여년 전 처음에는 신생업체로 대체되었고 그 다음에는 systemd로 대체되었습니다. )

아직도 기억하다systemd로 마이그레이션하기 위한 첫 번째 규칙.

이것은 systemd와 관련된 새로운 아이디어도 아닙니다. van Smoorenburg 및 Upstart 시스템 에서 rc해야 할 일은 . .rcrc.localrc/etc/rc.localrc

/etc/rc.localUnix의 일곱 번째 버전과 그 이전 버전으로 거슬러 올라갑니다. AT&T Unix System 3으로 대체되었으며 /etc/inittab실행 수준을 기반으로 합니다(AT&T Unix System 5 rc는 약간 다릅니다)./etc/inittab1983년. 심지어저것이제는 역사가 되었습니다.

nosh toolset의 서비스 번들 service-manager, Mewburn의 스크립트 system-control, systemd의 서비스 단위 파일, Upstart의 작업 파일, runit/s6/daemontools의 서비스 디렉터리-encore, van Smoorenburg의 스크립트 등 서비스 관리 시스템에 적합한 기본 서비스 정의를 생성하세요. ./etc/rc.d/rc/etc/init.d/rc

/etc/systemd/system/systemd에서는 이러한 관리자가 추가한 서비스 단위 파일이 일반적으로(또는 /usr/local/lib/systemd/system/드물게) 들어갑니다. nosh 서비스 관리자는 /var/local/sv/지역 서비스 묶음을 총괄하는 곳입니다. rcFreeBSD에서 Mewburn이 사용합니다 /usr/local/etc/rc.d/. 포장된그러나 서비스 단위 파일과 서비스 팩을 만드는 경우에는 다른 위치에 저장하십시오.

추가 읽기

답변3

요약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

답변4

크로나 @reboot부팅 프로세스의 일부가 아닌 시스템 재부팅 후 "곧" 발생해야 하는 작업을 지원하는 것은 사용 중인 초기화 시스템에 대한 모든 종류의 주의를 대체하는 좋은 방법입니다.

경고: ISC Cron이 필요합니다. 그러나 특정 초기화 시스템보다 기본적으로 더 일반적으로 설치되고 활성화되는 것 같습니다.

관련 정보