systemctl 등록/ register systemd / 부팅때마다 실행 / 자동 실행 / booting 시 실행 / init /
systemd 등록 방법
systemd 에 의해 실행되려면 service unit file 이 있어야 한다. 같은 이름이 이미 존재하면 안된다.
다음 명령으로 현재 존재하는 service 이름들을 확인하자.
sudo systemctl list-unit-files --type-service
sudo vi /etc/systemd/system/myapp.service
sudo chmod 640 /etc/systemd/system/myapp.service
systemctl edit myservice
systemctl edit myservice
로 생성하는 것을
권장한다.(참고로, edit 를 하면, override 되는 값만 넣어야 한다.
ExecStart 가 들어가면 ExecStart= 값이 두번있다고 에러가 뜬다.) 만약
존재하지 않는 service 인 경우
systemctl edit --force --full myservice.service
를 사용해서
create 하라고 나온다.
service unit file
- Systemd: Service File Examples - ShellHacks
- Understanding Systemd Units and Unit Files | DigitalOcean
- systemd.service
/home/myhome/myserver-start.sh
를 실행하도록 하는
service unit file 이다. $MAINPID
값은 실행된 service 에 대한
PID 값이다. 그래서 아래처럼 ExecStop
을 하면, 실행된
myserver-start.sh 의 pid 에 대해서 kill 하게 된다.
multi-user.target
은 run level2 로 보면 된다.(참고1,
참고2)
[Unit]
Description=MyApp Service
Wants=network.target mongod.service
[Service]
Environment="SECRET=pGNqduRFkB4K9C2vijOmUDa2kPtUhArN"
Environment="ANOTHER_SECRET=JP8YLOc2bsNlrGuD6LVTq7L36obpjzxd"
Type=simple
User=ec2-user
Group=ec2-user
WorkingDirectory=/home/myhome
ExecStartPre=
ExecStart=/home/myhome/myserver-start.sh
ExecStartPost=
ExecStop=/bin/kill -TERM $MAINPID
ExecReload=
[Install]
WantedBy=multi-user.target
Type=simple
or
Type=forking
- redhat enterprise linux - systemd forking vs simple? - Super User
- Forking
in a systemd script - Unix & Linux Stack Exchange :
Type=forking
은 실행하려는 process 가 fork 를 하고, 죽어버리고, child 만 계속 도는 process 라면, 이 type 을 쓴다.
Restart
를 사용할
때 주의할 점
Restart
를 넣었더니, 일정시간(RestartSec=1
)
이후에 restart 를 시도해 버려서 제대로 실행되지 못했다.
(holdoff time over
error 가 계속 발생했다.)
확인 테스트
sudo systemctl daemon-reload
sudo systemctl start myapp
booting 때마다 실행하려면
sudo systemctl enable myapp
실행하려는 app 이 shell script 인 경우
shell script 시작부분에 #!/bin/bash
를 넣어주면
된다.
#!/bin/bash
user mode
systemctl edit --user --force --full pms-fish
systemctl start --user pms-fish
systemctl status --user pms-fish
journalctl --user -u pms-fish.service -r
User, Group 을 지우고 사용하자. 안그러면, operation not permission error 가 발생한다.
[Unit]
Description=MyApp Service
Wants=network.target mongod.service
[Service]
# User=ec2-user
# Group=ec2-user
...
[Install]
...
See Also
- Run a Java Application as a Service on Linux | Baeldung on Linux : java application 에 대한 service 등록
- Chapter 1. Working with systemd unit files Red Hat Enterprise Linux 9 | Red Hat Customer Portal
- Deploying
Spring Boot Applications: Spring Boot 을 systemd 로 실행할때
댓글 없음:
댓글 쓰기