[关闭]
@xtccc 2018-07-25T08:52:06.000000Z 字数 2073 阅读 3617

systemd实现自启动

Linux


参考:


目录

目标


以akka-spray为例,我们为它设置:

  1. 开机自动启动
  2. 如果进程挂了,会自动再启



akka-spray是一个Java进程,由一个shell script来管理(start / stop / restart)。我们事先已经这些做成了service命令:

启动: service realtime spray start
停止:service realtime spray stop


配置文件


先创建一个文件/usr/lib/systemd/system/akka-spray.service,编辑其内容:

  1. [Unit]
  2. Description=akka-spray
  3. Documentation=https://www.gridx.com
  4. Wants=network-online.target
  5. After=akka-agent.service
  6. [Service]
  7. Type=forking
  8. ExecStart=/sbin/service realtime spray start
  9. ExecStop=/sbin/service realtime spray stop
  10. PIDFile=/var/realtime/akka/run/spray.pid
  11. Restart=always
  12. [Install]
  13. WantedBy=multi-user.target



因为spray的Java进程,实际上是首先由一个shell script启动,启动完后shell script便退出了,所以需要做如下设置:

  1. Type=forking
  2. PIDFile=/var/realtime/akka/run/spray.pid

我们必须自己将spray Java的pid写入到PIDFile中,systemd将以此来判断目标进程是否在运行。


以下配置将使得spray在机器重启后、并且akka-agent.service启动好后再启动。同时,如果检测到spray进程挂了,那么systemd会立即再次启动spray进程。(这里,akka-agent.service是事先配置好的另一个systemd服务)

  1. Restart=always



如果希望开机后直接重启,不需要等某个我们的服务启动,那么可以这么设置:

  1. 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



现在我们重启机器,可以看到:

  1. 在akka-agent启动之后,akka-spray也自动启动了
  2. 如果akka-spray的Java进程挂了,那么它也会立即被systemd再次启动。



注意点


停止service

用systemd的命令(systemctl stop akka-spray)去关闭进程,它不会自动重启。
用其他方法关闭进程,都会导致spray被systemd自动重启,包括:


另外,当systemd关闭spray服务,或者重启时,都会先把PID这个文件删掉。所以,我们自己的程序,必须能够自动重新建立PID文件,并将spray的pid写入到该文件中。



/dev/err不存在

如果用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



查看log


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

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注