Debian系统下如何将项目添加到开机启动

需求背景:

​ 有一些服务、项目部署到服务器之后,需要一直在后台运行。而根据Linux的特性,进程会与终端关联,关闭终端后进程也会一并结束。

​ 如何让服务进程在后台持续运行呢?

​ 之前一直使用screen服务,但是要额外安装,而且服务器重启之后需要再次手动开启服务。


使用screen

​ 创建新的窗口: screen -R [screen_name]

​ 运行服务

​ 返回主窗口: Ctrl+A+D


有没有其他方法可以做到想要的效果呢?

>>解决方案:将项目添加到开机启动项


(一) update-rc.d

1. 首先进入 /etc/init.d 目录中

cd /etc/init.d

此时使用ls 命令,会看到展示出一些文件,这些文件关联的就是开机启动的项目。

2. 添加一个新文件

touch TestStartUp

3. 编辑文件,可按照启动项文件模板进行写入

vim TestStartUp
#!/bin/sh

### BEGIN INIT INFO
# Provides: TestStartUp
# Required-Start: $network $remote_fs $local_fs
# Required-Stop: $network $remote_fs $local_fs
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: Test start
# Description: A test for setting startup
### END INIT INFO

python /www/wwwroot/test-start/main.py >/dev/null 2>&1 &

exit 0

文件路径请按实际填写

main.py
from flask import Flask

app = Flask(__name__)


@app.route('/')
def hello():
    return "Hello, world!"


if __name__ == '__main__':
    app.run(host="127.0.0.1",port=3333)
注:该文件使用到了flask,可使用pip install flask 进行安装
启动项文件模板:
#!/bin/sh

### BEGIN INIT INFO
# Provides: [程序名称,唯一]
# Required-Start: $network $remote_fs $local_fs
# Required-Stop: $network $remote_fs $local_fs
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: [启动项的简短说明]
# Description: [启动项的完整说明]
### END INIT INFO

[需要执行的命令]

exit 0

文件名严格区分大小写,请注意!

友情提示:需要后台静默运行的程序,请使用nohup [需要执行的命令] >/dev/null 2>&1 & 方式来启动。最后的 exit 0 请不要删除!这个是返回正常退出信号的一个传值。

注:在这个模板中,Provides唯一 的,也就是在所有的开机启动项中,Provides不能有任何同名冲突。

Short-DescriptionDescription 随心情写。

需要执行的命令,按照正常的Bash Shell书写方式书写即可。

4. 对TestStartUp 文件添加可执行属性

chmod +x TestStartUp

chmod +x

对文件开放执行权限

Linux系统下,不同的文件类型,文件名会有不同的颜色,如:

20180524165513592.png

  1. 蓝色表示目录;
  2. 绿色表示可执行文件,可执行的程序;
  3. 红色表示压缩文件或包文件;
  4. 浅蓝色表示链接文件;
  5. 灰色表示其它文件;

补充:
chmod +xchmod u+x 的区别?
就是设置谁拥有执行这个文件的权限
chmod +xchmod a+x 是一样的,一般没有明确要求,可以就用chmod +x

u 代表用户
g 代表用户组
o 代表其他
a 代表所有

这意味着chmod u+x somefile 只授予这个文件的所属者执行的权限
chmod +x somefilechmod a+x somefile 是一样的
Just doing +x will apply it to all flags:[u]ser ,[g]roup, [o]thers.

5. 将脚本文件添加到开机启动项

update-rc.d TestStartUp defaults

然后重新启动系统,或者命令行执行 /etc/init.d/TestStartUp ,执行启动脚本进行验证。

6. 反向代理到测试域名(Test)进行公网访问测试

7. 补充:如何删除添加的启动项

以刚添加的启动项为例:

update-rc.d -f TestStartUp remove

其他方式待补充。

2022-08-15 补充 :

(二) systemctl

1. 进入 /etc/systemed/system 目录

cd /etc/systemed/system

此时使用ls 命令,会看到展示出一些文件,这些文件关联的就是开机启动的项目。

2. 编辑配置文件,按照模板进行写入

vim [serviceName].service 
[Unit]
Description=[serviceName service]
After=network.target syslog.target

[Service]
Type=simple
# 指定工作目录
WorkingDirectory=[workPath]
Restart=on-failure
RestartSec=5s
ExecStart=[bootFile(Path&&CMD)]

[Install]
WantedBy=multi-user.target

文件路径请按实际填写

无法执行shell内部命令
startJar.service
[Unit]
Description=start test jar
After=network.target syslog.target

[Service]
Type=simple
Restart=on-failure
RestartSec=5s
ExecStart=nohup java -jar -Xmx2G /home/testjar/test.jar >/dev/null 2>&1 &

[Install]
WantedBy=multi-user.target

3. 对startJar.service 文件添加可执行属性

chmod +x startJar.service

命令行执行 systemctl start startJar.service ,执行启动脚本进行验证。

4. 使用 systemctl enable 添加启动项

systemctl enable startJar.service

5. 补充:删除添加的启动项

以刚添加的启动项为例:

systemctl disable TestStartUp
最后修改:2023 年 09 月 02 日
如果觉得我的文章对你有用,请随意赞赏