作为超级用户,我crontab -e添加一行来获取cronsh.sh文件,如下所示:
0 0 * * * source /home/myname/cronsh.sh
Run Code Online (Sandbox Code Playgroud)
文件的内容cronsh.sh是这一行:
date >> /home/myname/cronlog.txt
Run Code Online (Sandbox Code Playgroud)
cronlog.txt然而,当我第二天检查该文件时,它是空的。我究竟做错了什么?
先感谢您
CRON 使用sh作为其默认 shell,并且source是 Bash shell 内置命令,因此在链接到 Bash 以外的任何内容时都无法识别,sh这对于系统 shell 来说并非如此(默认情况下通常是 Dash)...另一方面,相当于 for该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
Run Code Online (Sandbox Code Playgroud)
所以尝试更改source为.... 这同样适用于内容/home/myname/cronsh.sh。因此,请检查其语法是否适合 Dash,或者告诉 CRON 在 crontab 文件中的 cronjob 之前使用 Bash 并SHELL=/bin/bash设置,如下所示:
SHELL=/bin/bash
0 0 * * * source /home/myname/cronsh.sh
Run Code Online (Sandbox Code Playgroud)
值得一提的是,您通常不需要获取 Bash 脚本来执行它(除非您故意希望它在当前调用 shell 中而不是在子 shell 中执行),但更优选的方法是调用 Bash解释器本身并提供脚本文件作为参数,如下所示:
0 0 * * * /bin/bash /home/myname/cronsh.sh
Run Code Online (Sandbox Code Playgroud)
...如果您将 shebang 添加到脚本中,指定正确的解释器来调用 ie #!/bin/bash,然后在授予脚本执行权限后将脚本本身作为可执行文件调用,那么这也应该起作用,如下所示:
0 0 * * * /home/myname/cronsh.sh
Run Code Online (Sandbox Code Playgroud)
...这应该使您无需应用上述其他建议。