![脚本不通过 crontab 运行,但可以独立运行](https://linux22.com/image/960450/%E8%84%9A%E6%9C%AC%E4%B8%8D%E9%80%9A%E8%BF%87%20crontab%20%E8%BF%90%E8%A1%8C%EF%BC%8C%E4%BD%86%E5%8F%AF%E4%BB%A5%E7%8B%AC%E7%AB%8B%E8%BF%90%E8%A1%8C.png)
我有一个脚本,如果超过 3 天,它会提醒我重新启动计算机uptime
(尽管现在将其设置为 0 天,只是为了检查脚本是否正在运行,因为我的计算机仅启动了一天多...)。
我知道这不是最优雅的脚本但我正在尝试!:)
#!/bin/bash
up=$(uptime | grep "day" > /home/username/uptime.foo && awk < /home/username/uptime.foo '{ print $3 }')
[[ $up -gt 0 ]] && xmessage -center "Restart!"
我已经让它可执行,chmod + x checkup.sh
当我通过终端运行它时,它工作正常./checkup.sh
这个脚本的 crontab 条目是:
46 14 * * * /home/username/Desktop/./checkup.sh
因此它每天 14:46 运行......
所以...我认为它应该可以运行,除非我没有做任何非常愚蠢的事情。另外,您认为将此 bash 脚本移动到 可以吗/bin
?
答案1
一心一意:
首先我们给你一个基于用户的 bin 文件夹:
cd ~/ && mkdir bin
您想使用 crontab。让我们从一些非常简单的事情开始:
* * * * * touch /tmp/testing.txt
好的,这样就行了
现在让我们尝试运行一个执行相同操作的脚本
* * * * * /home/username/bin/touchtest.sh
每分钟运行一次,直到它正常工作。
不,你不需要在行中间加 ./。./ 适用于提供相对网址的情况。
好的,这样就可以了
现在让我们尝试运行一个调用 xmessage 的脚本
* * * * * /home/username/bin/rebootwarn.sh
不工作
首先,我们需要不依赖环境变量。这包括路径设置、x11 设置或其他任何内容(想到了 python 和 ruby 环境变量...)
让我们看起来有点像 anacron 的正确 cron 文件。我将其保存为测试
#Borrowed from anacron
SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
#End borrowed from anacron
* * * * * /bin/bash /home/username/bin/test.sh
设置为每分钟运行一次
crontab test
导入它
剧本
#!/bin/bash
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
export DISPLAY=:0.0
up=$(uptime | grep "day" > /home/dnaneet/uptime.foo && awk < /home/dnaneet/uptime.foo '{ print $3 }')
[[ $up -gt 0 ]] && xmessage -center "Restart!"`
好的,这样就行了……我们做了什么?
我们将所有命令更改为不依赖于未明确设置的路径我们
使用 bash 明确运行了脚本
我们告诉脚本我们期望显示为 DISPLAY:0.0
答案2
问题已解决,阅读Google手册:
描述:
- 我有使用
#!/bin/bash
作为标题的 脚本 - 我把剧本放在
/home/wc3/palert/
分析:
- crontab 无法运行我的脚本
- 但如果我手动运行它会显示输出,而且我也可以在我的网络上看到结果
- 这意味着 crontab 无法获取环境,不像在脚本文件夹上运行脚本时那样
回答:
使用下面这行代码将你的环境放到你的脚本中:
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/home/wc3/palert
改变这一点:
/home/wc3/palert
用:你放置脚本的位置例如/home/budi/script.sh
样本:
#!/bin/bash
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/home/budi
# Script continues...
尝试将您的脚本放在 crontab 上。
答案3
在我的情况下,一切都是因为它首先没有加载配置文件。所以只需使用-l
或--login
。像这样
@reboot bash -l /path/to/scirpt.sh >> /tmp/some.log