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-Description 和 Description 随心情写。
需要执行的命令,按照正常的Bash Shell书写方式书写即可。
4. 对TestStartUp
文件添加可执行属性
chmod +x TestStartUp
chmod +x
对文件开放执行权限
Linux系统下,不同的文件类型,文件名会有不同的颜色,如:
- 蓝色表示目录;
- 绿色表示可执行文件,可执行的程序;
- 红色表示压缩文件或包文件;
- 浅蓝色表示链接文件;
- 灰色表示其它文件;
补充: chmod +x
和chmod u+x
的区别?
就是设置谁拥有执行这个文件的权限chmod +x
和chmod a+x
是一样的,一般没有明确要求,可以就用chmod +x
u 代表用户
g 代表用户组
o 代表其他
a 代表所有这意味着
chmod u+x somefile
只授予这个文件的所属者执行的权限
而chmod +x somefile
和chmod 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