最近常遇到需要在linux系统中一直启动一个服务、或定时启动某服务的场景。
最简单的在用ssh连接启动程序,但因为程序是从ssh shell中fork出的子进程,程序会随着ssh的中断而中断。因此调研的两种方法
crontab
crontab轻量,不需要太多配置
1 | crontab -e #cron编辑的文件以用户为单位存放在 /var/spool/ |
crontab中任务的格式为
cron时间
命令
如每分钟向日志中写入”test”
1 | * * * * * echo "test" >> ~/1.log |
cron时间是一个类似于正则的表达可以在这里查看https://crontab.guru/
systemd
systemd更“重”一点,优点是自动记录log、通过配置.service文件就可以传入环境变量给进程。但配置.service文件比较麻烦
systemd是一个linxu服务管理工具,面向进程。系统的init进程就是它创建的。
ps -ef
查看:
操作步骤
在/etc/systemd/system中添加service配置文件mytest.service
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22[UNIT]
服务描述
Description=Browser Preview Service
指定了在systemd在执行完那些target之后再启动该服务
After=network.target
[Service]
定义Service的运行类型
Type=simple
定义systemctl start|stop|reload *.service 的执行方法(具体命令需要写绝对路径)
ExecStartPre为启动前执行的命令
项目中有相对路径时要指定工作目录
WorkingDirectory=/root/http_server
ExecStart=/root/http_server/main 8090
ExecReload=
MAINPID是systemd记录的主进程PID
Restart=always
ExecStop=/bin/kill -9 ${MAINPID}
[Install]
多用户
WantedBy=multi-user.target查看service状态
1
systemctl status mytest.service
启动service
1
systemctl start mytest.service
停止service
1
systemctl stop mytest.service