20

我有一个非常简单的 shell 脚本,需要作为 cronjob 运行,但我什至无法运行测试脚本。这是示例脚本:

/home/myUser/scripts/test.sh

#!/bin/bash
touch file.txt

crontab:

* * * * * /home/myUser/scripts/test.sh

该脚本在终端上运行良好,但无法让它作为 cronjob 运行。到目前为止,我已经在 crontab 中尝试过这些:

SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

* * * * * /bin/bash /home/myUser/scripts/test.sh

这在脚本文件中:

PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/home/myUser/scripts

从我收集的内容来看,解决方案可能在 PATH 变量中,但我无法弄清楚它是什么,因为我的理解在这一点上非常有限。所以我的问题是,如何让我的脚本作为 cronjobs 运行?

编辑:该文件对所有用户都有 rwx 权限。这仅用于测试目的。

编辑: cronjobs 等* * * * * touch /home/myUser/scripts/test.txt工作,但它不会运行脚本。

4

5 回答 5

14

最简单的方法是使用 GUI:

对于 Gnome 使用gnome-schedule (universe)

sudo apt-get install gnome-schedule 

对于 KDE,使用kde-config-cron

It should be pre installed on Kubuntu

但是,如果您使用无头 linux 或不想要 GUI,您可以使用:

crontab -e

如果你把它输入终端,你会得到一张桌子。
你现在必须插入你的 cronjobs。
像这样格式化作业:

*     *     *     *     *  YOURCOMMAND
-     -     -     -     -
|     |     |     |     |
|     |     |     |     +----- Day in Week (0 to 7) (Sunday is 0 and 7)
|     |     |     +------- Month (1 to 12)
|     |     +--------- Day in Month (1 to 31)
|     +----------- Hour (0 to 23)
+------------- Minute (0 to 59)

也有一些短裤(如果你不想要 *):

@reboot --> only once at startup
@daily ---> once a day
@midnight --> once a day at midnight
@hourly --> once a hour
@weekly --> once a week
@monthly --> once a month
@annually --> once a year
@yearly --> once a year

如果您想将短裤用作cron(因为它们不起作用):

@daily --> 0 0 * * *
@midnight --> 0 0 * * *
@hourly --> 0 * * * *
@weekly --> 0 0 * * 0
@monthly --> 0 0 1 * *
@annually --> 0 0 1 1 *
@yearly --> 0 0 1 1 *
于 2013-11-03T16:13:27.017 回答
12

file.txt 在什么目录?cron 在您的主目录中运行作业,因此除非您的脚本cd在其他地方,否则它将在其中查找/创建 file.txt。

编辑:当您在 shell 中引用一个文件而不指定其完整路径(例如file.txt,与完整路径相反/home/myUser/scripts/file.txt)时,您会认为您是在引用当前工作目录中的文件。当您运行脚本时(无论是交互还是通过 crontab),脚本的工作目录与脚本本身的位置无关;相反,它继承自运行脚本的任何内容。

因此,如果您cd(更改工作目录)到脚本所在的目录然后运行它,file.txt将引用与脚本相同目录中的文件。但是,如果您不cd先在那里,file.txt将引用您在运行脚本时碰巧位于的任何目录中的文件。例如,如果你的主目录是 /home/myUser,并且你打开一个新的 shell 并立即运行脚本(as scripts/test.shor /home/myUser/scripts/test.sh;./test.sh将不起作用),它将触及文件 /home/myUser/file.txt,因为 / home/myUser 是您当前的工作目录(因此也是脚本的)。

当您从 运行脚本时cron,它基本上做同样的事情:它运行它时将工作目录设置为您的主目录。因此,脚本中的所有文件引用都相对于您的主目录,除非脚本cd位于其他位置或指定文件的绝对路径。

于 2013-11-03T16:47:45.763 回答
6

尝试,

 # cat test.sh
 #!/bin/bash
 /bin/touch file.txt

cron 为:

 * * * * * /bin/sh /home/myUser/scripts/test.sh

您可以通过以下方式确认:

 # tailf /var/log/cron
于 2013-11-03T17:25:28.007 回答
1

指定完整路径并授予脚本文件适当的权限。我尝试通过 cron 运行以下脚本文件:

#!/bin/bash
/bin/mkdir /scratch/ofsaaweb/CHEF_FICHOME/ficdb/bin/crondir

crontab 命令是

* * * * * /bin/bash /scratch/ofsaaweb/CHEF_FICHOME/ficdb/bin/test.sh

它对我有用。

于 2018-03-08T07:18:10.580 回答
0

它也应该在 cron 上正常运行。请检查以下内容。

1-您正在编辑正确的文件以设置 cron。

2-您已授予脚本适当的权限(执行权限)意味着您的脚本是可执行的。

于 2013-11-03T16:00:52.350 回答