시스템 서비스의 사용자 정의 위치

시스템 서비스의 사용자 정의 위치

알릴 방법이 있나요체계특정 경로에서 서비스 파일을 검색하시겠습니까?

그냥 이렇게맨페이지상태, 검색 경로는 컴파일 타임에 결정됩니다. 그래서 XDG_DATA_DIRS환경변수 설정을 해봤는데/etc/systemd/user.conf

Environment="XDG_DATA_DIRS=/custom/path/lib" 

하지만 작동하지 않습니다.

추신: 내 서비스는 다음을 통해 이루어졌습니다.데이터베이스 버스.

답변1

--시스템 버스

systemd --system버스는 systemd를 사용하는 "일반적인" 방법입니다. 이는 시스템 전체 버스이며 root버스 man systemd.unit의 로드 경로를 --system다음과 같이 설명합니다.

/etc/systemd/system.control
/run/systemd/system.control
/run/systemd/transient
/run/systemd/generator.early
/etc/systemd/system          <-- local units usually go here
/run/systemd/system
/run/systemd/generator
/usr/local/lib/systemd/system
/lib/systemd/system          <-- packaged units usually go here
/run/systemd/generator.late

이 매뉴얼 페이지에는 다음과 같은 내용도 나와 있습니다.

변수가 설정되면 $SYSTEMD_UNIT_PATH변수의 내용이 단위 부하 경로를 덮어씁니다. 빈 구성 요소(":")로 끝나는 경우 $SYSTEMD_UNIT_PATH일반적인 단위 로딩 경로가 변수 내용에 추가됩니다.

이 변수를 설정하면 로드 경로 앞에 SYSTEMD_UNIT_PATH=/my/path/:추가됩니다 . /my/path그러나 systemd가 이미 실행 중이므로 명령줄에서 간단히 실행할 수는 없습니다.

SYSTEMD_UNIT_PATH=/my/path: systemd

버스의 환경을 설정하려면 시스템 버스에 영향을 미치도록 다음 파일의 값을 설정 systemd --system해야 합니다 .man systemd-system.conf

/etc/systemd/system.conf
/etc/systemd/system.conf.d/*.conf   <-- Install your change here
/run/systemd/system.conf.d/*.conf
/lib/systemd/system.conf.d/*.conf

이 구성에 무엇을 넣을지에 관해 매뉴얼 페이지에서는 다음을 설명합니다.

ManagerEnvironment=
    Takes the same arguments as DefaultEnvironment=, see above. Sets 
    environment variables just for the manager process itself. In contrast 
    to user managers, these variables are not inherited by processes spawned 
    by the system manager, use DefaultEnvironment= for that. Note that these
    variables are merged into the existing environment block. In particular, 
    in case of the system manager, this includes variables set by the kernel 
    based on the kernel command line.

따라서 이 파일을 다음과 같이 설치하십시오 /etc/systemd/system.conf.d/mypath.conf.

[Manager]
ManagerEnvironment="SYSTEMD_UNIT_PATH=/my/path:"

면책 조항: 내 컴퓨터의 버전 250.4 SYSTEMD_UNIT_PATH에 문서화되어 있지만 man systemd.unit이는 문서화되어 있지 않습니다.여기. 이는 아마도 해당 기능을 더 이상 사용하지 않는다는 의미일 것입니다. SYSTEMD_UNIT_PATH컴퓨터의 매뉴얼 페이지에 설명되어 있지 않으면 지원되지 않는 것입니다(또는 더 이상 지원되지 않습니다) . 이 경우 유일한 옵션은 /etc/systemd/system/각 유닛이 존재하는 곳마다 심볼릭 링크를 생성하는 것입니다.

--사용자 버스

systemd --user버스는 로그인한 모든 사용자에 대해 실행됩니다. 사용자 백업, 사용자 마운트, GUI 시작 또는 VNC 서버와 같은 기타 데스크탑 환경에 유용합니다. 이 버스의 장치를 관리하려면 systemctl --user {start,stop} ...( 없이 ) 을 실행해야 합니다 sudo. 버스 man systemd.unit의 로드 경로를 --user다음과 같이 설명합니다.

$XDG_CONFIG_HOME/.config/systemd/user.control
$XDG_RUNTIME_DIR/systemd/user.control
/run/systemd/transient
/run/systemd/generator.early
$XDG_CONFIG_HOME/.config/systemd/user or $HOME/.config/systemd/user
$XDG_CONFIG_DIRS/.config/systemd/user or /etc/xdg/systemd/user
/etc/systemd/user
$XDG_RUNTIME_DIR/systemd/user
/run/systemd/user
$XDG_RUNTIME_DIR/systemd/generator
$XDG_DATA_HOME/systemd/user or $HOME/.local/share/systemd/user
$XDG_DATA_DIRS/systemd/user or /usr/local/share/systemd/user
$dir/systemd/user for each $dir in $XDG_DATA_DIRS
/usr/local/lib/systemd/user/*
/usr/lib/systemd/user/*
$XDG_RUNTIME_DIR/systemd/generator.late/*

systemd 버스의 환경을 설정하려면 다음 파일 에서 버스에 영향을 미치는 설정 값을 --user찾아야 합니다 .man systemd-user.confuser

~/.config/systemd/user.conf     <-- Here if it should affect one user
/etc/systemd/user.conf
/etc/systemd/user.conf.d/*.conf <-- Here if it should affect all user buses
/run/systemd/user.conf.d/*.conf
/usr/lib/systemd/user.conf.d/*.conf

DefaultEnvironment=이 경우에는 또는 을 설정해야 할지 잘 모르겠 ManagerEnvironment=으므로 둘 다 설정하겠습니다.

[Manager]
ManagerEnvironment="XDG_DATA_DIRS=/my/path:/usr/share/gnome:/usr/local/share/:/usr/share/"
DefaultEnvironment="XDG_DATA_DIRS=/my/path:/usr/share/gnome:/usr/local/share/:/usr/share/"

그럼 유닛을 넣어야지/my/path/systemd/user/

답변2

$XDG_DATA_DIRbashrc/profile.d가 아닌 systemd 환경 변수를 사용하여 환경 변수를 설정해야 한다고 생각합니다 .

나는 첫 번째 예를 믿는다systemd.환경 생성기당신이 원하는 것을하십시오. 빠른 참조를 위해 아래에 복사했습니다.

# 50-xdg-data-dirs.sh

#!/bin/sh
# SPDX-License-Identifier: CC0-1.0

# set the default value
XDG_DATA_DIRS="${XDG_DATA_DIRS:-/usr/local/share/:/usr/share}"

# add a directory if it exists
if [ -d /opt/foo/share ]; then
    XDG_DATA_DIRS="/opt/foo/share:${XDG_DATA_DIRS}"
fi

# write our output
echo "XDG_DATA_DIRS=${XDG_DATA_DIRS}"

또 다른 가능성은 에서 언급한 것처럼 각 서비스 파일 내의 .conf파일에 시스템 변수를 정의하는 것 입니다./etc/systemd/system.conf.d/이 다른 SO

관련 정보