systemd에서 실행 파일의 절대 경로를 피하는 방법은 무엇입니까?

systemd에서 실행 파일의 절대 경로를 피하는 방법은 무엇입니까?

저는 이미 Upstart 서비스를 포함하는 여러 프로젝트를 보유하고 있으며 /etc/initSVN 작업 복사본에서 해당 서비스를 직접 심볼릭 링크하는 접근 방식을 구현하고 있습니다. Upstart는 단순히 심볼릭 링크의 대상을 읽고 추가 스크립트나 서비스 자체의 실행 파일을 실행할 수 있는 내장형 스크립팅을 제공합니다. 내 설정에서 중요한 것은 다음 줄뿐입니다.

cd "$(dirname "$(dirname "$(readlink "/etc/init/${UPSTART_JOB}.conf")")")"

이렇게 하면 작업 복사본에 대한 절대 경로를 하드 코딩할 필요가 없고 단순히 심볼릭 링크와 다양한 프로젝트의 일부 정의된 상대 디렉터리 레이아웃에 의존할 수 있습니다. 나는 systemd에 대해 동일한 접근 방식을 구현하고 싶지만 제안된 개념을 최대한 고수하고 싶습니다. 이는 이전에 사용했던 방식으로 임베디드 스크립트를 지원하지 않는 것 같습니다.

systemctl enable /usr/local/.../someApp.service나는 그것이 내가 할 수 있다는 것을 이미 알고 있습니다 .SVN 작업 복사본에 내 서비스 정의를 유지합니다.. 현재 내가 놓치고 있는 유일한 것은 readlink절대 경로를 하드 코딩할 필요가 없도록 내 접근 방식을 올바르게 채택하는 것입니다. 나는 다음과 같은 내용을 읽었습니다.지정자이미 있지만 내 이해로는 절대 경로를 제공하지 않으며 심볼릭 링크를 해결하지 않습니다.

그 외에도 추가 명령줄을 사용하여 쉘을 직접 실행할 수 있으며 이론적으로는 readlink거기에 내 접근 방식을 포함시킬 수 있습니다. 하지만 보기에는 추악해 보입니다.

제가 염두에 두고 있는 또 다른 접근 방식은 시스템 전체에 걸친 디스패처 스크립트입니다. 저는 이미 시스템 전체 /usr/local/vendor에 걸쳐 지정자를 전달할 수 있고 readlink외부적으로 접근 방식을 구현하는 스크립트를 가지고 있습니다.

하지만 제가 놓치고 있는 더 쉬운 것이 있나요? %f해결된 심볼릭 링크 대상은 다음과 같이 간단합니다 .

ExecStart = %f/../../bin/someApp.pl

다음 예보다 더 쉬워 보입니다.

ExecStart = /bin/sh -c "..."

ExecStart = /usr/local/vendor/systemd/dispatcher "%f"

감사해요!

답변1

아니요, systemd에는 이에 대한 내장 기능이 없습니다.

Upstart와 마찬가지로 셸을 호출해야 합니다.

관련 정보