28 May 2018 in linux / devops on ubuntu
- systemd is now supported by most linux system, and is the recommended way contrast to old upstart and init
- the systemd config file is under /lib/systemd/system
- env vars only able to be set in ExecStart or ExecStartPre, best way is to set in the script
- WorkingDirectory can not use double quote, seems to be a bug?
- if you app run like
java -jar
, should useType=simple
instead ofType=forking
, otherwise it will case a timeout
after move the config under the folder /lib/systemd/system
#auto-start sudo systemctl enable servicename.service #reload sudo systemctl daemon-reload
Run/Stop Service
#start sudo systemctl start servicename.service #stop sudo systemctl stop servicename.service
View log
#view status, little log systemctl status servicename.service #view the last 50 lines systemctl status service-name -n50 #view all the log systemctl --no-pager -l status servicename.service #view all the log journalctl -u service-name.service #view the last 50 lines journalctl -n 50 --no-pager -u service-name.service #tail the log journalctl -f -u service-name.service
Example
Myexample [Unit] Description=Example [Service] Type=simple #for java, should not be forking #note the bash should specify its full path ExecStart=/bin/bash /home/ubuntu/myapp.sh [Install] WantedBy=multi-user.target
init
Reference:
upstart
upstart is designed to replace init, but then
upstart is replaced by systemd from ubuntu 16
- place servicename.conf under /etc/init/ which is system job.
- place servicename.conf under $HOME/.init/ which is user job.
- console log is written to /var/log/upstart/servicename.log
- it support log rotating
Run/Stop Service
#start sudo start servicename #stop sudo stop servicename
Example
author "ureshika.com" description "start and stop example for Ubuntu (upstart)" version "1.0" start on started networking stop on runlevel [!2345] setuid ubuntu setgid ubuntu # set env env APPUSER="ubuntu" env APPDIR="/usr/bin" respawn script cd $APPDIR #use env #set env via shell script JAVA_OPTS="\ -Dcom.sun.management.jmxremote.port=8089 \ -Dcom.sun.management.jmxremote.rmi.port=8089 \ -Djava.rmi.server.hostname=localhost \ -Dcom.sun.management.jmxremote.authenticate=false \ -Dcom.sun.management.jmxremote.ssl=false \ " exec /usr/bin/java $JAVA_OPTS -jar jetty-runner.jar \ --classes "." \ --host 0.0.0.0 --port 8080 \ app.war end script
Refs
The Story Behind ‘init’ and ‘systemd’: Why ‘init’ Needed to be Replaced with ‘systemd’ in Linux