作为超级用户,我crontab -e
向源文件添加一行,cronsh.sh
如下所示:
0 0 * * * source /home/myname/cronsh.sh
该文件的内容cronsh.sh
是这一行:
date >> /home/myname/cronlog.txt
cronlog.txt
但是第二天我检查文件时,文件是空的。我做错了什么?
先感谢您
答案1
CRON 用作sh
其默认 shell,并且source
是 Bash shell 内置命令,因此无法识别sh
除 Bash 之外的任何链接,而系统 shell 则不是这种情况(默认情况下通常为 Dash)...另一方面,命令的等效项source
应该.
在那里工作...参见下面的演示:
$ echo "$0"
bash
$
$ type . source
. is a shell builtin
source is a shell builtin
$
$
$ sh
$
$ echo "$0"
sh
$
$ ls -l /bin/sh
lrwxrwxrwx 1 root root 4 Jul 11 12:03 /bin/sh -> dash
$
$ type . source
. is a special shell builtin
source: not found
因此尝试更改source
为.
... 同样适用于的内容。因此请检查其语法是否 Dash 友好,或者在 crontab 文件中的 cronjob 之前/home/myname/cronsh.sh
使用 Bash 并设置 CRON,如下所示:SHELL=/bin/bash
SHELL=/bin/bash
0 0 * * * source /home/myname/cronsh.sh
值得一提的是,你通常不需要获取 Bash 脚本来执行它(除非你故意希望它在当前调用 shell 中执行,而不是在子 shell 中执行),但更可取的方法是调用 Bash 解释器本身并将脚本文件作为参数提供,如下所示:
0 0 * * * /bin/bash /home/myname/cronsh.sh
...如果您在脚本中添加一个 shebang,指定正确的解释器来调用 ie #!/bin/bash
,然后在授予其执行权限后将脚本作为可执行文件本身调用,那么这也应该有效,就像这样:
0 0 * * * /home/myname/cronsh.sh
... 这应该可以使您免于应用上面提到的其他建议。