(我已经阅读了如何测试新的 cron 脚本?。)
我有一个特定的问题(cron 作业似乎没有运行或正常运行),但问题很普遍:我想调试 cronned 的脚本。我知道我可以设置 * * * * * crontab 行,但这不是一个完全令人满意的解决方案。我希望能够从命令行运行 cron 作业,就像 cron 正在运行它一样(相同的用户、相同的环境变量等)。有没有办法做到这一点?必须等待 60 秒来测试脚本更改是不切实际的。
Pis*_*tos 98
这就是我所做的,它似乎在这种情况下有效。至少,它向我显示了一个错误,而作为用户从命令行运行时却没有显示错误。
第 1 步:我将此行临时放在用户的 crontab 中:
* * * * * /usr/bin/env > /home/username/tmp/cron-env
Run Code Online (Sandbox Code Playgroud)
然后在写入文件后将其取出。
第 2 步:让我自己做一个小的 run-as-cron bash 脚本,其中包含:
#!/bin/bash
/usr/bin/env -i $(cat /home/username/tmp/cron-env) "$@"
Run Code Online (Sandbox Code Playgroud)
那么,作为有问题的用户,我能够
run-as-cron /the/problematic/script --with arguments --and parameters
Run Code Online (Sandbox Code Playgroud)
显然可以扩展此解决方案以使用 sudo 等以获得更大的灵活性。
希望这对其他人有帮助。
Mar*_*rco 48
我提出了一个基于 Pistos 答案的解决方案,但没有缺陷。
将以下行添加到 crontab,例如使用 crontab -e
* * * * * /usr/bin/env > /home/username/cron-env
Run Code Online (Sandbox Code Playgroud)创建一个 shell 脚本,该脚本在与 cron 作业运行相同的环境中执行命令:
#!/bin/sh
. "$1"
exec /usr/bin/env -i "$SHELL" -c ". $1; $2"
Run Code Online (Sandbox Code Playgroud)用:
run-as-cron <cron-environment> <command>
Run Code Online (Sandbox Code Playgroud)
例如
run-as-cron /home/username/cron-env 'echo $PATH'
Run Code Online (Sandbox Code Playgroud)
请注意,如果需要参数,则需要引用第二个参数。脚本的第一行加载一个 POSIX shell 作为解释器。第二行是 cron 环境文件的来源。这是加载正确的 shell 所必需的,它存储在环境变量中SHELL。然后它加载一个空环境(以防止环境变量泄漏到新 shell 中),启动用于 cronjob 的相同 shell 并加载 cron 环境变量。最后执行命令。
Dja*_*nny 24
由于 crontab 不做这项工作,你将操纵它的内容:
crontab -l | grep -v '^#' | cut -f 6- -d ' ' | while read CMD; do eval $CMD; done
Run Code Online (Sandbox Code Playgroud)
它能做什么 :
默认情况下,我见过的大多数默认 cron 守护程序,根本无法告诉 cron 现在就在这里运行。如果您使用 anacron,我认为有可能在前台运行一个单独的实例。
如果您的脚本运行不正常,那么您就没有考虑到这一点
来自 crontab(5):
cron(8) 守护进程会自动设置几个环境变量。SHELL 设置为 /bin/sh,LOGNAME 和 HOME 是从 crontab 所有者的 /etc/passwd 行设置的。PATH 设置为“/usr/bin:/bin”。HOME、SHELL 和 PATH 可能会被 crontab 中的设置覆盖;LOGNAME 是运行作业的用户,不能更改。
一般来说 PATH 是最大的问题,所以你需要:
如果您需要在没有 shell 的情况下以其他用户身份运行脚本(例如 www-data),请使用 sudo:
sudo -u www-data /path/to/crontab-script.sh
Run Code Online (Sandbox Code Playgroud)
当然,在所有这些之前要测试的第一件事是您的脚本实际上执行了它应该从命令行执行的操作。如果你不能从命令行运行它,它显然不能与 cron 一起工作。