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="을 추가하여 문제를 해결할 수 있습니다. 또한 환경 변수를 생성한 유닛 이후에 유닛이 항상 실행되도록 종속성을 추가하세요.