부팅시 마지막 서비스로 시스템 서비스를 어떻게 만드나요?


26

몇 년 전에 시작 스크립트를에 작성할 수 있습니다 /etc/rc.local. 모든 시스템 서비스가로드되면 스크립트가 실행됩니다.

이제 우리는 systemd를 사용하지만 rc.local더 이상 은 없습니다. Systemd는 서비스를 병렬로 시작합니다. 자체 서비스를 작성하여 rc.local을 작동시킬 수 있지만 모든 시스템 서비스가로드 된 후에는 서비스가 실행되도록 보장 할 수 없습니다.

그것을 할 수있는 방법이 있습니까? 아니면 사용해야 Before하고 Aftersystemd 서비스 파일에?



5
시동되지 않은 시스템!
比尔 盖子

이름과 버전을 지정 하시겠습니까?
STTR

운영체제 : Arch Linux, 버전 : N / A
比尔 盖子

1
@ 比尔 盖子 왜 "마지막"인지, 스크립트의 종속성을 모르십니까, 아니면 그냥 안전하기를 원하십니까?
Paul

답변:


27

체계적으로 다른 서비스 주변에서 서비스를 잘 사용 Before=하고 After=주문 하는 것이 좋습니다 .

당신이 사용하지 않고있는 방법을 요구하지만 이후 Before그리고 After, 당신은 사용할 수 있습니다 :

Type=idle

이는 같은 man systemd.service설명 :

의 동작은 다음 idle과 매우 유사합니다 simple. 그러나 모든 활성 작업이 발송 될 때까지 서비스 프로그램의 실제 실행이 지연됩니다. 이것은 쉘 서비스의 출력이 콘솔의 상태 출력과 인터리빙되는 것을 피하기 위해 사용될 수 있습니다. 이 유형은 콘솔 출력을 향상시키는 데만 유용하며, 일반 장치 주문 도구로는 유용하지 않으며,이 서비스 유형의 효과는 5 초의 시간 초과에 따라 서비스 프로그램이 호출 된 후에 적용됩니다.


1
안녕하세요, 전이나 후에 사용할 경우 구문을 자세히 설명 하시겠습니까?
r4ccoon

누군가가 사용자 프로세스가 시스템 프로세스에서 분리 실행하고자하는 경우 다소 다른 주제,하지만, 거기에 askubuntu.com/a/859583/457417는
벤 크리시

세트로 완벽하게 일 /proc/sys/kernel/modules_disabled1부팅 프로세스의 끝에서
스튜어트 Cardall

0

"부팅"에 대한 정의에 따라 다릅니다. 게티가 시작한 직후에 실행하기를 원한다고 가정합니다. 이렇게하려면 서비스를 /etc/systemd/system/getty.target.wants/디렉토리 에 추가해야합니다 . 또한 파일이이 디렉토리의 다른 서비스와 유사한 코드를 사용하고 있는지 확인해야합니다. 부팅 및 종료시 사용자 지정 서비스를 실행하려면 (마더 보드 부저에서 경고음 만 울림) 다음 스크립트를 사용합니다./etc/systemd/system/getty.target.wants/service_name.service

[Unit]
After=systemd-user-sessions.service plymouth-quit-wait.service
After=rc-local.service
Before=getty.target
IgnoreOnIsolate=yes

[Service]
ExecStart=/usr/bin/myinitscript.sh start
ExecStop=/usr/bin/myinitscript.sh stop
Type=oneshot
RemainAfterExit=true

[Install]
WantedBy=basic.target

/usr/bin/myinitscript.sh 실행 파일이며 시작시 shebang이 있습니다.

이 시점에서 모든 것이 시작되지는 않지만 로그온 프롬프트가 사용자에게 표시되는 시점입니다.

이 사용을하지 않지만 Before=하고 After=, 나를 위해 훨씬 더 이해할 수 있었고 실제로 작동; 위의 답변을 충분히 정보를 찾지 못했습니다. 이것은 또한 당신이 모두 사용할 수 있도록 ExecStart=하고 ExecStop=오히려 제한되지 않고, Type=simple-like 서비스를 제공합니다.


-2

구체적인 내용이나 ArchLinux에 익숙하지 않지만 일반적인 시스템 관리 방법은 다음과 같습니다.

기본적으로 systemd는 /etc/init.d/에있는 스크립트 모음으로 /etc/rcX.d의 심볼릭 링크로 표시됩니다. 여기서 X는 실행 수준의 수입니다. 심볼릭 링크 자체의 형식은 다음과 같습니다.

[K | S] + nn + [문자열]

어디에:

  • nn 은 해당 스크립트가 실행되는 순서를 결정하는 숫자입니다.
  • string 은 /etc/init.d/에 나타나는 스크립트 이름입니다.
  • 마지막으로 K 또는 S는 각각 stop 또는 start로 스크립트가 호출되는 명령을 결정합니다.

따라서 부팅 순서에서 스크립트를 마지막으로 실행하려면 다음을 수행해야합니다.

  1. 스크립트를 /etc/init.d/에 넣고 실행 가능하게 만드십시오.
  2. 스크립트가 시작될 대상 런레벨을 결정합니다 (일반적으로 콘솔의 경우 2, 그래픽 사용자 인터페이스의 경우 5). 같은 것으로 결정할 수 있습니다runlevel
  3. 이 런레벨에 어떤 스크립트가 있는지 살펴보고 이미 존재하는 스크립트 ls /etc/rc<target runlevel>.d/보다 큰 두 자리 숫자를 선택하십시오.
  4. update-rc.d데비안 기반 또는 chkconfigFedora와 같은 또는 수동으로 배포판에 맞는 유틸리티를 사용 하여 init 스크립트에 symlink /etc/rc.d/S를 만듭니다.

5
당신이 설명한 것은 실제로 sysVinit입니다. systemd가 sysVinit의 작동 방식과 호환된다는 것이 사실이지만, 한 가지 중요한 차이점이 있습니다. 모든 것이 병렬로 수행됩니다. sysVinit 서비스와 시스템 서비스의 두 가지 유형의 서비스도 있습니다. 귀하의 답변은 sysVinit 서비스 이후에 무언가를 실행하는 데 도움이 될 수 있지만 반드시 시스템화 된 것은 아닙니다.
Sam

1
Systemd는 처음부터 sysvinit와 호환되는 것을 목표로하지 않습니다.
lzap
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.