시스템 서비스 파일의 동적 논리

시스템 서비스 파일의 동적 논리

init.d다음 코드가 포함된 서비스 파일을 다시 작성하려고 합니다 .

    if [ ! -r /var/spool/torque/server_priv/serverdb ]; then
            DAEMON_SERVER_OPTS="-t create $DAEMON_SERVER_OPTS"
    fi
    start-stop-daemon --start --quiet --pidfile $PIDFILE --exec $DAEMON -- $DAEMON_SERVER_OPTS

나는 그것을 다음과 같이 다시 쓴다:

[Service]
Type=forking
ExecStart=/usr/sbin/pbs_server
PIDFile=/var/spool/torque/server_priv/server.lock

if하지만 systemd에서 콘텐츠를 표현하는 방법을 모르겠습니다 .

답변1

이미 말했듯이 복잡한 논리는 의도적으로 지원되지 않습니다 systemd. 시작 논리를 수행해야 하는 경우(데몬 자체의 일부는 아님) 작은 셸 스크립트를 작성하고 ExecStart=.

그러나 고려해야 할 사항이 있습니다. 쉘 스크립트기필코 아니다프로세스 관리를 직접 수행하십시오. 쉘 스크립트~ 해야 하다 exec악마. 이는 systemd의 자체 프로세스 모니터링 및 관리를 방해하지 않기 위한 것입니다.

잘못된 쉘 스크립트 예:

#!/bin/sh
if [ ! -r /var/spool/torque/server_priv/serverdb ]; then
        DAEMON_SERVER_OPTS="-t create $DAEMON_SERVER_OPTS"
fi

$DAEMON -- $DAEMON_SERVER_OPTS

이는 데몬을 쉘 인터프리터의 하위 프로세스로 만듭니다. 데몬이 분기되지 않았고 준비 프로토콜( Type=)이 켜져 있는 경우 simple이는 단지 유휴 중복 프로세스일 뿐입니다. 그렇지 않고 데몬이 분기되고 이를 설정하면 Type=forking모든 것이 이중 분기가 아닌 삼중 분기가 되며 systemd는 데몬을 종료합니다.

올바른 쉘 스크립트 예:

#!/bin/sh
if [ ! -r /var/spool/torque/server_priv/serverdb ]; then
        DAEMON_SERVER_OPTS="-t create $DAEMON_SERVER_OPTS"
fi

exec $DAEMON -- $DAEMON_SERVER_OPTS

이는 쉘 프로세스를 데몬 프로세스로 대체합니다.

답변2

당신은 이것을 좋아하지 않을 것입니다. 그러나 그것은 작동합니다:

ExecStart=/bin/bash -c '\
    if [ ! -r /var/spool/torque/server_priv/serverdb ]; then \
            DAEMON_SERVER_OPTS="-t create $DAEMON_SERVER_OPTS"; \
    fi; \
    exec /usr/sbin/pbs_server -- $DAEMON_SERVER_OPT'

답변3

systemd에는 그러한 기능이 없습니다. 이 논리는 실제로 데몬 내부에 속하기 때문입니다. 그러나 문제가 있는 데몬을 변경할 수 없는 경우 먼저 파일이 존재하는지 확인하고 적절한 환경 변수를 생성하는 간단한 유닛을 생성한 다음 유닛에 "EnvironmentFile="을 추가하여 문제를 해결할 수 있습니다. 또한 환경 변수를 생성한 유닛 이후에 유닛이 항상 실행되도록 종속성을 추가하세요.

관련 정보