저는 최근에 컴퓨터 부팅 순서 초기에 스크립트를 실행하기 위해 첫 번째 사용자 정의 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
에만 포함됩니다 .$PATH
sudo
/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.