脚本不通过 crontab 运行,但可以独立运行

脚本不通过 crontab 运行,但可以独立运行

我有一个脚本,如果超过 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手册:

描述:

  1. 我有使用#!/bin/bash作为标题的 脚本
  2. 我把剧本放在/home/wc3/palert/

分析:

  1. crontab 无法运行我的脚本
  2. 但如果我手动运行它会显示输出,而且我也可以在我的网络上看到结果
  3. 这意味着 crontab 无法获取环境,不像在脚本文件夹上运行脚本时那样

回答:

  1. 使用下面这行代码将你的环境放到你的脚本中:

    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

相关内容