我在 crontab 中有一个运行 @reboot 的 bash 脚本:
该脚本本身包含一个 wget 命令,用于从互联网上提取和下载文件
当我登录并打开终端后运行脚本时,它可以正常工作并正确保存文件(html,png)。但是当我重新启动系统时,它会保存运行并保存为没有内容的纯文本文件。
解决了
--> 我使用了 crontab 中的睡眠功能,它有效!
刚接触 Linux 和代码,非常感谢您的所有反馈!我还将探索 /etc/network/if-up.d/ 选项。
答案1
问题是几乎当然,您的@reboot
cron 作业在您的网络接口出现之前就已经开始了up
。一般来说,这是一个有据可查的缺点cron
。这并不意味着该@reboot
设施毫无用处,只是意味着您需要了解它是如何工作的,以及当它失败时如何解决它 - 就像您的情况一样(大概:)。
至少有两种方法可以做到这一点:
- 在您的 @reboot 作业中使用
sleep
,为网络提供更多时间来获取up
.您的crontab
条目将如下所示::
@重新启动睡眠10; /你的/bash/脚本/现在
我建议这里的值10
是给界面10秒的时间up
; YMMV,所以尝试不同的值。
- 跟进 @confetti 的建议(并感谢 @Celada),将您的脚本放入
/etc/network/if-up.d
.以下是可能有用的原型。请注意,它仅在系统第一次启动时运行(例如@reboot
,而不是每次网络接口启动时运行up
):
#!/bin/sh
NWKSTATUS=/var/run/the-network-is-up
# 请注意 /var/run 是一个临时文件系统,因此系统关闭
# 将有效地删除我们的标志文件“the-network-is-up”case "$IFACE" in
lo)
# 排除环回接口;我们不会考虑它
# 因为它不是一个真正的接口。我们仅
在真正的网络接口出现时设置该标志#
exit 0
;;
*)
;;埃萨克# 如果标志文件存在,我们就完成了
# 否则,我们将创建它如果 [ -e $NWKSTATUS ];然后退出 0
否则
触摸 $NWKSTATUS
fi# 在这里添加你的脚本...
所以 - 将以上所有内容放入一个文件中(例如setnwkstatus.sh
),然后将其保存在文件夹中/etc/network/if-up.d/
并使其可执行(即sudo chmod /etc/network/if-up.d/setnwkstatus.sh
)
答案2
cron
最有可能的问题是尝试运行脚本时网络接口未启动。
您可以让脚本在网络接口启动后运行。
将脚本放入/etc/network/if-up.d
并设置chmod +x
以便可以执行。每次网络接口出现时,其中的每个脚本都会被执行。