细节
操作系统:Solaris 10,更新11
硬件:M5-32 LDOM、V490、IBM x3650、T5240、VMware 虚拟机等...
EDITOR=vi
term=vt100
tmp 目录=/var/tmp
cron shell=/sbin/sh
My外壳=/bin/bash
问题
尝试通过 修改 crontab 时会发生一个非常有趣的错误crontab -e
。
如果我尝试使用 vi 作为编辑器来搜索不存在的字符串来crontab -e
验证和检查语法,然后尝试保存,它会呕吐并告诉我发生了错误,即使没有进行任何更改。
例子
admin@server# export EDITOR=vi
admin@server# crontab -e
在命令模式下,搜索不存在的字符串,例如“foobar123”。收到“未找到模式”后尝试:wq
,您将收到...
The editor indicates that an error occurred while you were
editing the crontab data - usually a minor typing error.
Edit again, to ensure crontab information is intact (y/n)?
('n' will discard edits.)
如果您厚颜无耻并选择立即返回并尝试保存它,现在将不会出现错误。从 VMware 到 M5-32 LDOM,再到 V490 物理,所有类型的 Solaris 上都可以重复此操作。好奇为什么 cron 会将搜索不存在的字符串解释为错误,但不说visudo
。
相关说明是 Solaris 11 不会产生此错误,这就引出了一个问题,如果这是某种 POSIX 规范,为什么它适用于 Solaris 10 而不是 11?
答案1
没有 Solaris 10 或 Solaris 11 的源代码,我不能肯定地说,但我怀疑托马斯·迪基根据他对 vim 的发现,他走在正确的轨道上。
我追踪到IllumOS源其中一个在ex/vi目录中搜索errcnt表明 errcnt 只会递增,并且errcnt 用作 main() 的返回码。
因此,任何在 vi 中增加 errcnt 的失败都会“冒泡”到 crontab 命令,其中crontab 的 IllumOS 源表明它会对除零以外的任何值不满意。
另请注意 crontab.c 中的注释!
311 ret = system(buf);
...
327 if ((ret) && (errno != EINTR)) {
328 /*
329 * Some editors (like 'vi') can return
330 * a non-zero exit status even though
331 * everything is okay. Need to check.
332 */
答案2
操作系统:Solaris 10,更新 11 硬件:LDOM、VMware 虚拟机等... EDITOR=vi term=vt100
我对 vi 和 crontab 行为的观察与上述类似。 Crontab -e 给出错误“编辑器指示您在编辑 crontab 数据时发生错误......”
你别无选择,只能一次又一次地编辑……或者放弃更改。使用 vi 编辑器对任何文件进行更改并尝试保存只会丢弃更改。我认为 vi 也是 crontab 行为的罪魁祸首。我现在有一个 vi 的包装脚本,强制它以零退出状态退出,以便 vi 可以保存对已编辑文件的更改。我将 crontab 内容重定向到一个文件并编辑该文件中的更改并将其重定向回 crontab。有点痛苦和烦人,但在我们到达Solaris 11.NK之前一直有效