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


51

我有一个脚本,如果uptime超过3天,我会提醒我重新启动计算机(尽管现在将其设置为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
我会将其放在/ opt / bin或〜/ bin中作为一般的最佳实践,以免破坏软件包认为问题所在的位置。
RobotHumans 2012年

如果您像这样运行脚本:/home/dnaneet/Desktop/./checkup.sh,它可以工作吗?我会把/home/dnaneet/Desktop/checkup.sh
LnxSlck

@LnxSlck是的,运行/home/dnaneet/Desktop/./checkup.sh正常。但是/home/dnaneet/Desktop/checkup.sh可能行不通吗?因为需要./
dearN

1
我认为cron对您的X会话一无所知。
glenn jackman 2012年

@glennjackman那是什么意思?这是否意味着通过crontab运行这样的脚本不允许在gnome环境中显示弹出消息?
dearN

Answers:


71

一心一意:

首先让我们为您提供一个基于用户的bin文件夹:

cd ~/ && mkdir bin

您要使用crontab。让我们从一个非常简单的事情开始:

* * * * * touch /tmp/testing.txt

好吧,那行得通

现在让我们尝试运行执行相同操作的脚本

* * * * * /home/username/bin/touchtest.sh

每分钟运行一次,直到它开始工作
不行,您不需要在行中间插入./。./用于提供相对的URL。
好吧,那行得通

现在让我们尝试运行一个调用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上


感谢您的回答。您说:“让我们看起来有点像anacron的适当cron文件。我将其保存为测试文件。”我们的是什么?crontab文件?:-/
dearN 2012年

这是我观察到的。首先,我必须删除=指定行之前和之后的空间DISPLAY。其次,当我编辑crontab文件并PATH按照建议添加并设置了以后运行的时间时,没有显示弹出窗口。但是,使用/bin/bash... 运行脚本时,弹出窗口显示良好。
dearN 2012年

您知道什么,一旦我将脚本更改为export DISPLAY=:0.0,它就可以正常工作。尽管在我的弹出窗口应该显示的钟点之后的大约5秒钟后有一个很大的余量,但您有什么建议吗?但是,是的,您对脚本的修改!
dearN

不知道5秒的延迟。
RobotHumans 2012年

3
我喜欢您逐步进行并总结的方式-谢谢!
jbobbins

10

问题已解决,请阅读Google手册:

描述:

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

分析:

  1. crontab无法运行我的脚本
  2. 但是,如果我手动运行,它将显示输出,并且我也可以在Web上看到结果
  3. 这意味着crontab无法像在脚本文件夹中运行脚本时那样获得环境

回答:

  1. 使用下面的代码在您的脚本中使用以下代码来放置环境:

    PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/home/wc3/palert
    

    改变这个:/home/wc3/palert
    with:你放置脚本的地方,例如/home/budi/script.sh

样品:

#!/bin/bash
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/home/budi
# Script continues...

尝试将脚本放在crontab上。


不适用于我
John Joe

对我来说像魅力一样工作!
1rq3fea324wre
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.