@xtccc
2018-07-25T16:52:06.000000Z
字数 2073
阅读 3769
Linux
参考:
目录
以akka-spray为例,我们为它设置:
- 开机自动启动
- 如果进程挂了,会自动再启
akka-spray是一个Java进程,由一个shell script来管理(start / stop / restart)。我们事先已经这些做成了service命令:
启动: service realtime spray start
停止:service realtime spray stop
先创建一个文件/usr/lib/systemd/system/akka-spray.service
,编辑其内容:
[Unit]
Description=akka-spray
Documentation=https://www.gridx.com
Wants=network-online.target
After=akka-agent.service
[Service]
Type=forking
ExecStart=/sbin/service realtime spray start
ExecStop=/sbin/service realtime spray stop
PIDFile=/var/realtime/akka/run/spray.pid
Restart=always
[Install]
WantedBy=multi-user.target
因为spray的Java进程,实际上是首先由一个shell script启动,启动完后shell script便退出了,所以需要做如下设置:
Type=forking
PIDFile=/var/realtime/akka/run/spray.pid
我们必须自己将spray Java的pid写入到PIDFile
中,systemd将以此来判断目标进程是否在运行。
以下配置将使得spray在机器重启后、并且akka-agent.service
启动好后再启动。同时,如果检测到spray进程挂了,那么systemd会立即再次启动spray进程。(这里,akka-agent.service是事先配置好的另一个systemd服务)
Restart=always
如果希望开机后直接重启,不需要等某个我们的服务启动,那么可以这么设置:
After=network-online.target
在以上文件设置好后,我们要使文件生效:
$ systemctl daemon-reload
实际上,只要是修改了配置文件,都应该用这个命令来重新加载配置。
然后enable开机自启动:
$ systemctl enable akka-spray
Created symlink from /etc/systemd/system/multi-user.target.wants/akka-spray.service to /usr/lib/systemd/system/akka-spray.service.
现在可以查看是否真的被enabled了:
$ systemctl is-enabled akka-spray
enabled
现在我们重启机器,可以看到:
用systemd的命令(systemctl stop akka-spray)去关闭进程,它不会自动重启。
用其他方法关闭进程,都会导致spray被systemd自动重启,包括:
另外,当systemd关闭spray服务,或者重启时,都会先把PID这个文件删掉。所以,我们自己的程序,必须能够自动重新建立PID文件,并将spray的pid写入到该文件中。
如果用systemd启动某个script,而这个script中用到了/dev/stderr,例如
echo -e "error-msg" > /dev/stderr
则会出错:
/dev/stderr: No such device or address
我们需要用2来代替/dev/stderr
echo -e "error-msg" 1>&2
How to see full log from systemctl status service?
查看全部service的log
journalctl
查看某个service的全部log
journalctl -u {service-name.service}
动态tail某个service的log
journalctl -u {service-name.service} -f