第一种简单方式,将命令写入/etc/rc.d/rc.local
- 将jar命令写入
.sh
脚本,比如/data/start-xxx.sh
,文件内容如下:
#!/bin/bash
cd /data/apps/
nohup java -jar -server xxx.jar >/dev/null 2>&1 &
解释如下:
nohup:不挂起(no hang up),退出终端(SSH会话)不影响命令在后台继续执行(但是能响应终端输入Ctrl + C发送的SIGINT信号)。
>/dev/null: 将命令的标准输出(stdout,进程中的fd为1)重定向到空设备(丢弃掉)。
2>&1:将标准错误输出(stderr, fd为2)重定向到标准输出,一并丢弃。
最后一个&符号:在后台运行程序,免疫Ctrl+C
。若未作重定向,结果会默认输出到终端。
在需要以后台服务运行的情况下,往往将nohup和&
搭配一起使用,这样既能免疫Ctrl + C
发送SIGINT信号,同时关闭SSH客户端(会发送SIGHUP信号),程序也照样运行而不受影响。
- 给文件添加可执行权限:
chmod +x /data/start-xxx.sh
chmod +x /etc/rc.d/rc.local
- 往
/etc/rc.d/rc.local
文件添加如下内容:
export JAVA_HOME=/usr/local/java/jdk1.8.0_281
export PATH=$PATH:$JAVA_HOME/bin
sh /data/start-xxx.sh
解释:
系统在启动时会执行一遍/etc/rc.d/rc.local
中的命令。因此将shell命令写入/etc/rc.d/rc.local
会达到开机启动的目的。
但是在测试中发现sh /data/start-xxx.sh
执行时找不到java命令。也就是说/etc/rc.d/rc.local
文件在开机执行时,/etc/profile
中的环境变量还没有被加载。因此需要先添加java环境变量。
第二种方式
系统环境: 阿里云Cent OS 7 64位
1 进入/lib/systemd/system, 可以看到很多以.service结尾的系统服务定义文件.
2 初次接触的话, 可以拷贝其中一个.service文件来进行修改.
$ cp cloud-final.service YOUR-SERVICE-NAME.service
一个示例如下:
[Unit]
Description=Execute your service description
# 注意服务启动顺序, 否则可能启动失败
After=network.target syslog.target cloud-config.service rc-local.service
Requires=cloud-config.target
Wants=network.target
[Service]
Type=simple
# 自定义可执行文件的"绝对路径"
ExecStart=/home/myexec/my_xxx_svr
[Install]
WantedBy=multi-user.target
vim编辑好后, wq保存退出.
3 加载文件改动
$ systemctl daemon-reload
4 systemctl测试一下能否正常启动
$ systemctl start YOUR-SERVICE-NAME.service
如果顺利的话, 服务就已经启动起来了.
$ systemctl is-active YOUR-SERVICE-NAME.service
$ active
5 将自己的服务设置为开机启动
$ systemctl enable YOUR-SERVICE-NAME.service
可以通过如下命令查看是否已经设置为开机启动:
$ systemctl is-enabled YOUR-SERVICE-NAME.service
$ enabled
参考资料:
http://www.cnblogs.com/lenmom/p/9191966.html