如何解决将TCL脚本错误放入crontab时出现的问题:;“错误写入”;stdout";:错误的文件号;?

如何解决将TCL脚本错误放入crontab时出现的问题:;“错误写入”;stdout";:错误的文件号;?,cron,tcl,stdout,expect,Cron,Tcl,Stdout,Expect,我有一个TCL脚本,它具有编写错误日志的功能,但当我将此脚本放入crontab时,遇到如下错误: error writing "stdout": bad file number while executing "puts $msg" 代码段包括: 如果{$logLevel>=0}{ puts $msg flush stdout } 但是这个脚本可以手动成功运行,只有当我把它放在crontab中时它才有错误 谢谢, Emre当您从cron运行程序时,它会在一个不寻常的环境中运行。特

我有一个TCL脚本,它具有编写错误日志的功能,但当我将此脚本放入crontab时,遇到如下错误:

error writing "stdout": bad file number
    while executing
"puts $msg"
代码段包括:

如果{$logLevel>=0}{

puts $msg

flush stdout 
}

但是这个脚本可以手动成功运行,只有当我把它放在crontab中时它才有错误

谢谢,
Emre

当您从cron运行程序时,它会在一个不寻常的环境中运行。特别是,没有终端,环境变量不同,stdin和stdout通常都不可用,并且stderr被重定向,因此如果出现任何故障,它会通过电子邮件发送给您。正如我们从您案例中的错误消息中所看到的,stdout是不开放的(从技术上讲,它只是说它不开放用于编写,但即使如此)<代码>放置如果没有其他说明,则默认在那里写入


基本解决方案?不要写信给stdout!在其他地方打开一个文件并写入该文件。或者,在crontab条目中定义stdout的重定向,使其到达某个明确的位置(因此可以从Tcl程序内部写入)。

将输出管道化到实用程序可能对cron作业有意义,因为输出会到达一个众所周知的位置。我在cron作业(主要是Solaris)中使用stdout从来没有遇到过问题,经常将cron中的脚本输出管道化到mailx@glenn:我看了一下,它似乎因cron的哪个实现而有所不同。@Donal Fellows,所以如果我想修复它,我应该更改crontab,如下所示:
521***myscript.sh>my.log 2>&1
,对吗?谢谢。@Donalwellows,但看起来它也因为同样的原因失败了。如果我不想更改脚本,是否有任何变通方法可以使用,因为它在正常的shell环境中工作良好。非常感谢!