부팅 시 시작되는 서비스로 설정하려는 node.js 애플리케이션이 있습니다.
/etc/systemd/system/TestApp.service에 스크립트를 생성하면 systemctl을 사용하여 이 작업을 수행할 수 있습니다.
문제는 이 애플리케이션이 화면 내에서 실행되기를 원하므로 시스템에 로그인하고 screen -r -D TestApp와 같은 명령을 실행하여 연결할 수 있다는 것입니다.
그러나 그렇게 하면 sysmtemctl이 실패하고 애플리케이션이 시작되지 않습니다.
내가 만든 스크립트는 다음과 같습니다.
[Unit]
Description=Script to start TestApp website on bootup
[Service]
ExecStart=/usr/bin/screen -S TestApp "/usr/bin/node /opt/NodeApps/TestApp/mainApp.js"
[Install]
WantedBy=multi-user.target
이것은 systemctl의 상태와 발생하는 오류입니다.
sudo systemctl status TestApp.service
TestApp.service - Script to start TestApp website on bootup
Loaded: loaded (/etc/systemd/system/TestApp.service; disabled; vendor preset: enabled)
Active: failed (Result: exit-code) since Sun 2020-09-13 09:35:21 UTC; 30s ago
Main PID: 13012 (code=exited, status=1/FAILURE)
Sep 13 09:35:21 sp-webserver systemd[1]: Started Script to start TestApp website on bootup.
Sep 13 09:35:21 sp-webserver screen[13012]: Must be connected to a terminal.
Sep 13 09:35:21 sp-webserver systemd[1]: TestApp.service: Main process exited, code=exited, status=1/FAILURE
Sep 13 09:35:21 sp-webserver systemd[1]: TestApp.service: Failed with result 'exit-code'.
시작 시 화면 내에서 실행되도록 설정하는 가장 좋은 방법을 제안해 주세요.
답변1
결국 제가 직접 문제를 해결하고 문제를 해결했습니다. 해결책은 다음과 같습니다.
/etc/systemd/system/TestApp.service 파일을 생성합니다.
[Unit]
Description=Script to start TestApp website on bootup
# Listed below are three [Service] sections, we need only one of them. These three list our three different ways we can do this.
All three sections will start the processes as non root user 'testuser'. If we want them to start the processes as root, then we'd say User=root OR User="root" (not sure which one)
# The service section without the use of screen.
[Service]
WorkingDirectory=/opt/NodeApps/TestApp
ExecStart=/usr/bin/node /opt/NodeApps/TestApp/mainApp.js
Restart=always
RestartSec=3
User=testuser
# The service section with the use of screen as separate process, i.e. node will start inside screen, but top will show screen and node as separate processes
[Service]
Type=forking
WorkingDirectory=/opt/NodeApps/TestApp
ExecStartPre=/usr/bin/screen -dmS TestApp
ExecStart=/usr/bin/node /opt/NodeApps/TestApp/mainApp.js
Restart=always
RestartSec=3
User=testuser
# The service section with the use of screen i.e. node will start inside screen, and top will show screen as a process (node does not get a separate pid)
[Service]
Type=forking
WorkingDirectory=/opt/NodeApps/TestApp
ExecStart=/usr/bin/screen -dmS TestApp /usr/bin/node /opt/NodeApps/TestApp/mainApp.js
Restart=always
RestartSec=3
User=testuser
[Install]
WantedBy=multi-user.target
이 파일을 저장한 후 다음을 수행하십시오.
- 파일의 소유권을 가져옵니다. (스도 chown)
- 실행할 수 없도록 권한을 644로 설정합니다( chmod 644 ).
다음 명령을 사용하여 테스트하십시오.
sudo systemctl start TestApp.service
sudo systemctl stop TestApp.service
sudo systemctl status TestApp.service
만족스러우면 다음과 같이 활성화하여 시작 시 실행되도록 하세요.
sudo systemctl enable TestApp.service