我在家中使用住宅 ISP 托管一台服务器,该 ISP 通过 DHCP 发布公共 IP 地址,也就是说,当我的 DCHP 租约续订时,我并不总是能得到相同的 IP。我创建了一个 bash 脚本来检查我的公共 IP 是否已更改,并通过电子邮件向我发送新的 IP 地址(如果已更改)。 “当前”IP 存储在我的主目录中的文本文件中,该文件是全局可读和可写的。我想每小时运行一次,但我似乎无法让 cron 运行任何为我提供工作机会。该脚本运行没有任何问题。
我已经查看了之前的问题,我认为不存在文件权限或输出处理问题。文件/作业永远不会出现在 /var/log/syslog 中。
想法?
版本控制
系统详细信息 ( uname -a
):Linux jasonbourne 5.10.0-19-amd64 #1 SMP Debian 5.10.149-2 (2022-10-21) x86_64 GNU/Linux
cron 详细信息 ( apt info cron
):Version: 3.0pl1-137
bash 详细信息 ( apt info bash
):Version: 5.1-2+deb11u1
bash 脚本:
#!/bin/bash
#known (current) IP
current_ip=`cat /home/jasonbourne/.current_ip`
#check for actual IP
check_ip=`dig -4 +short myip.opendns.com @resolver1.opendns.com`
if [ $check_ip != $current_ip ]
then
message="`hostname`'s IP address changed from $current_ip to $check_ip on `date +%D` at `date +%T`"
email="[email protected]"
subject="`hostname` IP address change!"
echo $message | mail -r $email -s "$subject" $email
echo $check_ip > /home/jasonbourne/.current_ip
fi
该脚本和我当前的IP有适当的权限:
jasonbourne@debian:~$ ls -la /usr/bin/public-ip-monitor.sh
-rwxr-xr-x 1 root root 873 Dec 28 20:14 /usr/bin/public-ip-monitor.sh
jasonbourne@debian:~$ ls -la /home/jasonbourne/.current_ip
-rw-rw-rw- 1 jasonbourne jasonbourne 15 Dec 28 21:28 /home/jasonbourne/.current_ip
crontab 和 cron.time 尝试:
cron 服务运行得很好:
jasonbourne@debian:~$ sudo systemctl status cron
● cron.service - Regular background program processing daemon
Loaded: loaded (/lib/systemd/system/cron.service; enabled; vendor preset: enabled)
Active: active (running) since Wed 2022-12-28 00:32:37 EST; 21h ago
Docs: man:cron(8)
Main PID: 14242 (cron)
Tasks: 1 (limit: 4583)
Memory: 1.0M
CPU: 3.949s
CGroup: /system.slice/cron.service
└─14242 /usr/sbin/cron -f
我已经将我的用户 crontab 设置为crontab -e
并尝试过0 * * * * /usr/bin/public-ip-monitor.sh
和@hourly /usr/bin/public-ip-monitor.sh
。我还将脚本放入了/etc/cron.hourly
.
答案1
/etc/cron.hourly/public-ip-monitor.sh
不起作用的原因是每小时的 cron 条目是通过run-parts
/etc/crontab 文件启动的:
01 * * * * root cd / && run-parts --report /etc/cron.hourly
运行部件关于其运行的内容有一定的规则:
run-parts 运行在下面描述的约束内命名的所有可执行文件,这些文件在目录目录中找到。
如果未给出 --lsbsysinit 选项和 --regex 选项,则名称必须完全由 ASCII 大写和小写字母、ASCII 数字、ASCII 下划线和 ASCII 减号连字符组成。
因此,以扩展名命名的文件.sh
将不会运行。