저는 소프트웨어를 시작하고 중지할 수 있도록 소프트웨어에 대한 서비스 파일을 설정하려고 노력해 왔습니다. 명령을 수동으로 실행하면 서버가 정상적으로 시작됩니다. 다음으로 이를 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