我有一个适用于 IRIX/Linux/macOS/FreeBSD 的安装程序/更新程序脚本,我想将其兼容性扩展到 Solaris。
我已经修复了一些不符合 POSIX 的部分,除了crontab
像这样生成的部分:
printf '%s\n' [email protected] '*/15 * * * * /path/cmd' | crontab -
# crontab -l # (on Linux/macOS/FreeBSD)
[email protected]
*/15 * * * * /path/cmd
注意: /path/cmd
除非检测到问题,否则是安静的
代码在 Solaris 上失败有以下三个原因:
MAILTO=
引发语法错误*/15
引发语法错误crontab -
尝试打开名为-
我用以下方法修复了 #2和#3:
printf '%s\n' '0,15,30,45 * * * * /path/cmd' | crontab
# crontab -l
0,15,30,45 * * * * /path/cmd
现在我不知道如何转换MAILTO=
零件。从 POSIX 转发电子邮件的方法是crontab
什么?
选择的解决方法:
感谢@ilkkachu和@Gilles'SO-stopbeingevil'指针,这就是我决定以符合 POSIX的方式模拟crontab行为的方式:MAILTO
# crontab -l
0,15,30,45 * * * * out=$(/path/cmd 2>&1); [ -n "$out" ] && printf \%s\\n "$out" | mailx -s "Cron <$LOGNAME@$(uname -n)>" [email protected]
但是,这个解决方案有一个潜在的问题:如果printf
不是内置的 shell并且输出太大,那么它将失败并出现类似的问题。Argument list too long
请注意,
MAILTO
即使在受支持的情况下,这对软件安装程序也没有好处,因为它是一个全局设置:它将适用于 crontab 中的所有条目,而不仅仅是您的软件添加的条目。如果您希望您的软件将电子邮件发送到不同的地址,您需要在自己的代码中进行处理。这意味着您需要自己处理退出状态和清空输出的逻辑。
这是一些实现此逻辑的未经测试的代码。用空格替换换行符(或只是删除它们)以将它们放在 crontab 文件中的单行上。
此代码仅使用 POSIX 功能以及广泛可用的
mktemp
. 不幸的是,它在 IRIX 上不可用。如果 IRIX 有一个 POSIX 兼容的 m4,你可以用它来实现mktemp
. 作为后备,您可以将临时文件存储在用户主目录下的某个位置,或者存储在只有其他人可以写入的其他目录中。不要在共享目录中创建具有可预测名称的临时文件,例如/tmp
: that's insecure。