사용자 정의 시스템 서비스를 위한 쉘 스크립트는 어디에 설치해야 합니까?

사용자 정의 시스템 서비스를 위한 쉘 스크립트는 어디에 설치해야 합니까?

저는 최근에 컴퓨터 부팅 순서 초기에 스크립트를 실행하기 위해 첫 번째 사용자 정의 systemd 서비스를 만들었습니다. 사용자 정의 .service파일이 에 복사되고 있는데 /etc/systemd/system, 내가 아는 한 이 위치는 패키지를 통해 또는 운영 체제 배포의 일부로 배포되지 않는 사용자 정의 서비스의 올바른 위치입니다.

oneshot네트워크 스택 및 dhcpcd를 시작하기 전에 쉘 스크립트를 호출하여 호스트 이름을 동적으로 설정하는 유형 서비스 입니다 . 서비스 정의는 다음과 같습니다.

[Unit]
Description=Set hostname on startup, based on hardware serial number
Wants=local-fs.target
After=local-fs.target
Before=systemd-hostnamed.service network.target

[Service]
Type=oneshot
ExecStart=/SOMEPATH/hostname-from-serialnumber.sh

[Install]
WantedBy=systemd-hostnamed.service network.target

쉘 스크립트를 위한 가장 좋은 위치가 어디인지 확신할 수 없으므로 SOMEPATH위의 코드 블록에 자리 표시자를 넣었습니다. 이 쉘 스크립트의 올바른 위치는 무엇입니까? 왜?

답변1

/etc/systemd/system/*.service사용자 정의 서비스 파일의 적절한 위치가 무엇인지에 대한 귀하 의 의견은 절대적으로 옳습니다.

스크립트는 다음과 같이 입력하세요./usr/local/...바꾸다 /usr/.... 그건 당신이 대본을 썼기 때문이에요. 이 규칙이 존재하는 몇 가지 이유는 다음과 같습니다.

  • 의 파일은 /usr/{bin,lib,share}/패키지 관리자가 소유합니다. 어떤 패키지가 그것을 소유하고 dpkg -S <file>있는지 pacman -Qs <file>또는 rpm -q --whatprovides <file>어떤 파일에서든 찾을 수 있어야 합니다 .
  • 어떤 파일이 "자신의 것"인지 기억할 수 있습니다(즉, 이 시스템을 다시 빌드하면 복사해야 할 항목이나 패키지에서 얻을 수 있는 항목을 쉽게 확인할 수 있습니다).
  • 패키지가 설치된 경우 일반적으로 명명된 스크립트는 패키지로 덮어쓰여지지 않습니다.

이제 다음 디렉터리를 선택해야 합니다. 옵션은 다음과 같습니다:

  • /usr/local/bin#!/bin/bash: 스크립트가 실행 가능하고(예: 컴파일된 바이너리 또는 or 와 같은 shebang 사용 #!/usr/bin/python3) 모든 사용자가 실행할 수 있는 경우에 적용됩니다. 너무 간단해서 많이 사용하고 있어요.
  • /usr/local/sbin: 스크립트가 요구 사항을 충족하는 경우 적합 /usr/local/bin하지만 사용자가 실행해서는 안 됩니다. 대신 시스템 관리자만 실행해야 합니다. 일반적으로 환경 /usr/local/sbin에만 포함됩니다 .$PATHsudo
  • /usr/local/lib: 일부 시스템(예: Debian 기반 시스템)에서는 이 디렉토리에 사용자나 쉘 스크립트가 직접 실행할 수 없는 내부 바이너리가 포함될 수 있습니다. 그러나 다른 시스템(예: Redhat 기반 시스템)에서는 lib개체 파일과 라이브러리만 포함됩니다.
  • /usr/local/libexec: 이 디렉토리에는 사용자나 쉘 스크립트가 직접 실행할 수 없는 내부 바이너리가 포함되어 있습니다. 이 기능은 일부 배포판에서만 지원됩니다.
  • /usr/local/share/<ServiceName>/. 이는 스크립트가 실행 가능하지 않고 아키텍처에 독립적인 경우(즉, 컴파일되지 않은 경우)에만 적용됩니다. 스크립트가 있지만 실행 가능 *.sh하지 않은 shebang경우 인터프리터를 호출하고 경로를 스크립트에 대한 인수로 전달하여 스크립트를 실행해야 합니다. /bin/bash /path/to/script.sh. 이 경우 스크립트는 읽기 전용 아키텍처 독립적 데이터 파일로 간주될 수 있으며 /usr/local/share혼란을 피하기 위해 다른 하위 디렉터리에 배치 해야 합니다 /usr/local/share. 귀하의 서비스를 위해 작성하기로 선택한 모든 문서도 통합될 수 있습니다 share.

답변2

음... 어려운 질문이군요. 이것이 비 OS 코드이고 배포판의 일부가 아니라고 가정하면 일반적으로 /usr/local/lib/system으로 이동하여 /etc/systemd/system에서 링크해야 한다고 말합니다. 문제는 시스템이 시작될 때 모든 파일 시스템이 마운트되지 않으면 문제가 발생할 수 있다는 것입니다. 따라서 운이 좋다면 업그레이드로 덮어쓸 가능성이 적은 이름을 지정하고 대부분의 항목이 포함된 동일한 디렉터리인 /lib/systemd/system에 적절한 링크를 지정해 볼 수 있습니다. IMHO.

관련 정보