开机启动最简单的方法是在/etc/rc.local启动脚本中写入需要执行的命令。另一种方式是在/etc/init.d中编写一个启动脚本。但是这两种方式都不是正规的启动模式。init.d是Linux最早的服务管理方案,命令service start xxx就是去调用init.d中的启动脚本。之后init机制被systemd系统取代。linux的1号进程由init替换为systemd。systemd是system daemon的缩写,意思是系统的守护者。systemd提供了一组工具和机制来管理Linux的服务。例如systemctl与journalctl都是systemd命令。本文主要介绍如何使用systemd机制设置开机启动。systemd基础知识参考阮一峰的博客

首先需要在/lib/systemd/system/中添加一个文件。本例中我们要为neo4j数据库配置开机自启动,添加文件neo4j.service。写入

[Unit]
Description=Neo4j Graph Database

[Service]
Type=forking
User=root
Group=root
Restart=on-failure
RestartSec=5s
ExecStart=/usr/local/lib/neo4j-community-4.4.28/bin/neo4j start
ExecReload=/usr/local/lib/neo4j-community-4.4.28/bin/neo4j restart
ExecStop=/usr/local/lib/neo4j-community-4.4.28/bin/neo4j stop
LimitNOFILE=1048576

[Install]
WantedBy=multi-user.target

然后执行systemctl enable neo4j.service。这个命令会创建一个软连接,将neo4j.service链接到/etc/systemd/system/multi-user.target中,这样neo4j被设定为开机任务之一了。如果不重启也可以使用systemctl start neo4j.service直接启动neo4j数据库。

1. 配置中可能出现的问题

1.1 Permission deny

一开始配置的时候,不能启动neo4j。使用journalctl -r -g neo4j倒序观察与neo4j相关的系统日志。纵使发现启动命令Permission deny。这个问题有两种可能的原因。有可能是启动用户配置错误,service下的User和group应当与与neo4j程序的owner一致,本例中都是root。

第二个原因是SELinux限制了权限。即使是root用户,如果selinux检查文件不安全也会禁止启动。可以将启动程序所在的文件夹标记为安全文件。使用命令restorecon -rv /usr/local/lib/neo4j-community-4.4.28标记neo4j安装目录下的所有文件。

1.2 启动成功,但是程序很快退出

这个错误非常隐晦。采用systemctl status neo4j查询neo4j状态,虽然显示succeed,但是状态时inactive,并且提示exit。无论restart,start都没有用。这个原因时Service的Type没有设置正确。simple其实是脚本启动,启动完成后脚本程序就结束了。一般服务是在脚本中使用nohup,或者在程序中创建了daemon进程。但是neo4j程序没有这样做。所以启动之后,systemd又停止了命令。对于这种情况,应该将type设定为forking。这种启动方式会fork一个进程执行启动命令,然后主进程推出,子进程作为daemon进程。

03-19 14:26