systemd 단위 파일에서 소스 코드를 실행하고 서비스를 시작하기 위해 내보내는 방법

systemd 단위 파일에서 소스 코드를 실행하고 서비스를 시작하기 위해 내보내는 방법

저는 소프트웨어를 시작하고 중지할 수 있도록 소프트웨어에 대한 서비스 파일을 설정하려고 노력해 왔습니다. 명령을 수동으로 실행하면 서버가 정상적으로 시작됩니다. 다음으로 이를 bash 스크립트로 구현했는데 정상적으로 시작되었습니다. 배시 스크립트:

#!/bin/bash
/bin/cd /opt/software/test/; source software_env.sh
export TEST_APP="/opt/software/testapp"
/bin/cd /opt/sotware/test/bin/; startserver

이 명령을 시스템 파일에 구현하려고 시도했지만 기록할 수 없는 것 같습니다. 그래서 다음으로 시도한 것은 bash 스크립트를 유지하고 다음과 같이 시스템 파일에서 호출하는 것이었습니다.

[Unit]
Description=Test Service

[Service]
Type=forking
ExecStart=/opt/software/test/test.startup

[Install]
WantedBy=multi-user.target

또한 서비스 유형을 다음으로 설정해 보았 Type=simple으나 작동하지 않았습니다. 재부팅 시 cron을 통해 bash 스크립트를 실행하여 서버를 성공적으로 시작할 수 있지만 해당 bash 스크립트를 서비스 파일에 넣을 수 있는 방법이 있다면 그것이 제가 궁극적으로 하고 싶은 일입니다.

유닛 파일에서 소스와 내보내기가 제대로 작동하도록 하는 것이 어려운 것 같습니다. 또한 bash 스크립트가 작동하도록 했을 때 몇 가지 이상한 동작을 발견했습니다. source /opt/software/test/software_env.sh대신 /bin/cd /opt/software/test/; source software_env.sh작동하지 않았습니다.

systemd의 오류는 이를 실행하려는 다양한 기술에 관계없이 이 오류를 발생시킵니다.

test.service - Test service
Loaded: bad-setting (Reason: Unit test.service has a bad unit file setting.)
Active: failed (Result: exit-code)
Main PID: 2778 (code=exited, status)

모든 조언에 감사드립니다.

답변1

systemd는 쉘 명령줄을 직접 사용할 수 없습니다. 따라서 일부 쉘 구현을 전달하여 파일을 얻을 수 있습니다. 귀하의 경우 다음과 같이 단위를 수정해 볼 수 있습니다.

ExecStart=/bin/sh -c '. /opt/software/test/software_env.sh'

Freedesktop에는 systemd에 대한 매뉴얼이 있습니다.확인 해봐.

답변2

소스 파일이 어떻게 생겼는지 모르겠지만 간단한 VAR=VALUE 형식인 경우 EnvironmentFile 함수를 사용할 수 있습니다.

[Service]
EnvironmentFile=/opt/software/test/software_env.sh
WorkingDirectory=/opt/software/test
Environment=TEST_APP=/opt/software/testapp
Type=forking
ExecStart=/opt/software/test/test.startup

관련 정보