gpt4 book ai didi

bash - 使用 printf 打印出在 Crontab 中运行程序之前的时间,给出 "invalid directive"错误

转载 作者:行者123 更新时间:2023-12-04 18:37:09 27 4
gpt4 key购买 nike

我正在运行 Ubuntu 21.10 并尝试设置 crontab 任务。
我希望在任务开始之前将日期和时间打印到控制台,所有这些都记录到日志文件中。
这就是我目前所拥有的。

{ printf "\%(\%Y-\%m-\%d \%H:\%M:\%S)T  Started Task\n"; <run task> } >> /path/to/log/file
当我输入 printf "%(%Y-%m-%d %H:%M:%S)T Started Task\n"我得到了预期的输出: 2021-10-20 15:22:03 Started Task但是,在 crontab 中,我知道您必须逃脱 "%"\ .除非在逃出所有 % 之后我最终得到一个错误: /bin/sh: 1: printf: %(: invalid directive无论如何尝试格式化 crontab,我仍然会遇到同样的错误。
如果有人知道我做错了什么,请帮助我,谢谢。
我的具体cronjob如下:
0 * * * * { printf "\%(\%Y-\%m-\%d \%H:\%M:\%S)T  Updating Certs\n"; sudo certbot renew  --post-hook "systemctl reload nginx.service postfix.service dovecot.service"; } >> /home/ubuntu/logs/certbot.log

最佳答案

定时任务 可能会令人惊讶,因为它的工作目录不是 $HOME它的默认 shell 是 /bin/sh而不是用户外壳。
在编写 crontab 时,您必须记住:

  • 使用完整路径几乎是强制性的。
  • 使用大括号对指令进行分组时 { } ,您必须在最后一条指令的末尾加上一个分号。
  • 默认 /bin/sh , printf可以仅限于 POSIX 功能(这意味着它不会理解 %()T 构造)。

  • 话虽如此,这就是您如何使用 /bin/sh为您的目的:
    0 * * * * { date '+\%Y-\%m-\%d \%H:\%M:\%S  Started Task'; <command>; } >> /full/path/to/log/file
    一个完全不同的解决方案是改变你的 crontab 的 shell,比如 Cyrus's answer正在建议。

    关于bash - 使用 printf 打印出在 Crontab 中运行程序之前的时间,给出 "invalid directive"错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69648885/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com