将简单的 shell 脚本作为 cronjob 运行
Posted
技术标签:
【中文标题】将简单的 shell 脚本作为 cronjob 运行【英文标题】:Running a simple shell script as a cronjob 【发布时间】:2013-11-14 07:23:26 【问题描述】:我有一个非常简单的 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
工作,但它不会运行脚本。
【问题讨论】:
我要补充一点,您在 crontab 中将您的 shell 指定为/bin/sh
(这是默认设置),但是您的脚本需要一个 bash shell(与 sh 不同)。检查使用 sh yourScript.sh
运行脚本是否仍然有效?
【参考方案1】:
最简单的方法是使用 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 *
【讨论】:
cronjob 已经每分钟运行一次 (* * * * *) 但它没有执行脚本。 该行是否以whitespace
结尾?
我认为这不是问题所在。见第二次编辑。 Crontab 不运行脚本,但它可以正常工作。【参考方案2】:
file.txt 在什么目录? cron 在您的主目录中运行作业,因此除非您的脚本 cd
s 在其他地方,否则它将在其中查找/创建 file.txt。
编辑:当您在 shell 中引用一个文件而不指定其完整路径(例如 file.txt
,而不是完整路径 /home/myUser/scripts/file.txt
)时,您指的是当前工作目录中的文件.当你运行一个脚本时(无论是交互还是通过 crontab),脚本的工作目录与脚本本身的位置没有任何关系;相反,它继承自运行脚本的任何内容。
因此,如果您cd
(更改工作目录)到脚本所在的目录然后运行它,file.txt
将引用与脚本在同一目录中的文件。但是,如果您不首先在那里cd
,file.txt
将引用您在运行脚本时碰巧位于的任何目录中的文件。例如,如果您的主目录是 /home/myUser,并且您打开一个新的 shell 并立即运行脚本(因为 scripts/test.sh
或 /home/myUser/scripts/test.sh
;./test.sh
将不起作用),它将触及文件 / home/myUser/file.txt 因为 /home/myUser 是您当前的工作目录(因此也是脚本的)。
当您从cron
运行脚本时,它的作用基本相同:运行它时将工作目录设置为您的主目录。因此,脚本中的所有文件引用都是相对于您的主目录进行的,除非脚本 cd
s 在其他地方或指定了文件的绝对路径。
【讨论】:
file.txt 与 test.sh 脚本位于同一目录中。 那么问题就来了。在脚本中添加/home/myUser/scripts
(或将触摸命令更改为touch /home/myUser/scripts/file.txt
)。
这解决了问题。你能告诉我为什么需要文件的完整路径吗?
我收到此错误“sh: 0: Can't open /root/scritps/cron_job.sh”,当尝试从 cronjob 执行 sh 文件时,如“*/1 * * * * sh /root/scritps/cron_job.sh >> /tmp/cron.output 2>&1".FYI:cron_job.sh 只做回显。知道这里有什么问题吗?
@BipinVayalu 是“脚本”的“脚本”拼写错误?【参考方案3】:
试试,
# cat test.sh
#!/bin/bash
/bin/touch file.txt
cron 为:
* * * * * /bin/sh /home/myUser/scripts/test.sh
您可以通过以下方式确认:
# tailf /var/log/cron
【讨论】:
【参考方案4】:指定完整路径并授予脚本文件适当的权限。我尝试通过 cron 运行以下脚本文件:
#!/bin/bash
/bin/mkdir /scratch/ofsaaweb/CHEF_FICHOME/ficdb/bin/crondir
而crontab命令是
* * * * * /bin/bash /scratch/ofsaaweb/CHEF_FICHOME/ficdb/bin/test.sh
它对我有用。
【讨论】:
【参考方案5】:它也应该在 cron 上正常运行。请检查以下内容。
1- 您正在编辑正确的文件以设置 cron。
2- 您已授予脚本适当的权限(执行权限)意味着您的脚本是可执行的。
【讨论】:
以上是关于将简单的 shell 脚本作为 cronjob 运行的主要内容,如果未能解决你的问题,请参考以下文章
如何检查 Linux shell 脚本是不是由 cronjob 执行?
sh 用于Cronjob的Mongodump Shell脚本