四:解决方案
由于此服务器是无网络不能直接联网使用,还有其他的三方工具可以做定时任务,不过小编没有采取,我使用了 Systemd Timers
这里说明一下,我这边出现问题的地方是 Cron 定时器并不是脚本有问题,所以我这里改用的定时器是 System Timers
五:实现步骤
1、检查 Systemd 的版本信息:
首先查看 Linux 中是否能够使用 Systemd Timers 可是使用命令 systemctl --version
systemctl --version
如果出现了以下相关的版本的信息就可以了。因为 System Timers 是 Systemd 初始化系统的一部分,因此只要 Linux 系统使用 Systemd 作为初始化系统,那么 Systemd Timers 功能就应该使用
2、查找 Systemd 相关文件:
使用命令 which systemctl
which systemctl
3、查看 Systemd 服务:
使用命令 systemctl list-unit-files --type=service
systemctl list-unit-files --type=service
4、检查 Systemd Timers:
为了确认 Systemd Timers 是否可用,可以使用命令 systemctl list-unit-files --type=timer 来列出系统中所有的定时器
systemctl list-unit-files --type=timer
或者使用命令 systemctl list-timers 查看已激活的定时器
systemctl list-timers
如果看到列出的 .timers 单元文件,那么 System Timers功能已经在自己的系统中了
五:具体实现
上面确定了自己的操作系统是可以使用 System Timers 功能的,那么接下来就是实现的步骤:
步骤一:首先要创建一个新的 .timer 文件,这个文件存放的位置是不能随意的。我这里存放的是 /etc/systemd/system/ 目录下,我这里取名 test.timer
vim /etc/systemd/system/test.timer
随后进行编辑 timer 中的内容
[Unit]
Description=Run Test at 22:55 daily
[Timer]
OnCalendar=*-*-* 22:55:00
Persistent=true
[Install]
WantedBy=multi-user.target
其中:
[Timer] 部分中的指令设置了定时器的触发时间。(这个可以根据自己的需求去修改)
Persistemt=true 确保定时器在系统重启后仍然有效
[Install] 部分中的 WantedBy=multi-user.target 确保定时器在系统达到多用户运行级别时被启用
步骤二:创建一个以 .service 后缀结尾的文件,同样和 .timer 后缀结尾的文件在同一个目录下
vim /etc/systemd/system/test.service
[Unit]
Description=Test Service
[Service]
Type=simple
ExecStart=/你的脚本的路径/脚本.sh
Restart=on-failure
[Install]
WantedBy=default.target
其中:
[Unit] 段落定义了单元的基本属性,Description=Test Service 这是一个描述
[Service] 段落包含了运行服务的具体指令和其他配置。Type=simple 这个选项制定了服务类型 simple 类型意味着服务执行单个主进程,并且 Systemd 可以使用默认方法控制这个进程
Restart=on-failure:这个选项表示如果服务失败(退出状态非零),Systemd 将尝试重启该服务。这可以确保即使服务出现错误,它会自动重新启动并尝试继续运行
请注意:各位如果使用的话,需要将 /你的脚本的路径/脚本.sh 替换为自己需要的实际的脚本路径,并且保证该脚本具有可执行权限(可以通过命令 chmod +x /你的脚本的路径/脚本.sh 进行设置)
步骤三:使更改生效
systemctl daemon-reload
systemctl enable --now test.timer
需要通知 Systemd
重新加载配置,并启用和启动你的新定时任务
检查所有的定时任务
systemctl list-timers
也可以使用命令 systemctl list-unit-files | grep test
systemctl list-unit-files | grep test
其中,可以发现以 .timer 结尾的文件是 enable 状态另外一个以 .service 结尾的是 disabled 结尾。
当我们使用 System 的定时器 .timer 单元的时候,通常会关联一个服务 .service 单元。定时器负责在特定的时间触发服务的执行。在这个例子中 test.timer 被设置为启用状态,而 test.service 被标记为禁用状态。尽管这个 test.service 被标记为 disabled,这并不意味着服务单元文件本身有问题或不可用。 disabled 状态仅仅表示服务不会在系统启动时自动启动,也不会被定时器或其他依赖它的单元自动触发。
然而,当定时器触发时,它会临时启用并启动相关的服务,即使服务被标记为 disabled ,这是因为 Systemd 的设计允许定时器在触发时动态地启动服务,而无需服务始终处于启动状态。Systemd 会根据需要自动处理服务的启动和停止,因此各位不需要手动启动服务
如果我们想要验证服务是否在定时器触发时被正确启动,可以检查系统日志,使用命令 journalctl
# 查看最近日志
journalctl
# 查看最近 24 小时日志
journalctl --since "24 hours ago"
# 显示日志条目的JSON格式
journalctl --output=json
可以根据需要去查看下日志情况
小编的写作与表述能力还需要进一步的提升,旨在分享一下我的小小的经验,真心的希望能够帮助各位。主要是我们这边的服务器全部都不能联网的状态,其中 Docker、Nginx、Redis等等的中间件都需要完全的离线部署,后面我也会继续的分享工作中的小小的经验
欢迎各位同行前辈们批评指正,小编一定会更虚心倾听并改正的!
说在最后,所以昨天没写完,这次补了下篇欢迎各位批评指正!