手动执行.ksh脚本sendmail正常,Autosys触发时无法发邮件
针对你遇到的手动执行脚本正常、Autosys触发时sendmail日志显示size=0的问题,可按以下方向排查解决:
强制使用绝对路径引用邮件内容文件
Autosys作业的默认工作目录通常和你手动执行脚本时的当前目录不一致,脚本中如果用相对路径path/myfile,Autosys触发时会找不到文件。直接把路径改成绝对路径,比如/opt/mail_templates/myfile,或者在脚本开头添加cd /path/to/file/dir切换到文件所在目录后再执行sendmail命令。替换输入重定向方式
部分调度工具对<输入重定向的处理逻辑和终端环境不同,试试用管道传递文件内容:cat /full/path/to/myfile | /usr/sbin/sendmail -t这种方式更稳定,能避免重定向在非终端环境下的兼容性问题。
添加脚本调试日志
在脚本中sendmail命令前增加调试步骤,确认文件状态和内容:# 记录文件信息 ls -l /full/path/to/myfile >> /tmp/mail_debug.log 2>&1 # 记录文件内容 cat /full/path/to/myfile >> /tmp/mail_content.log 2>&1 # 执行sendmail /usr/sbin/sendmail -t < /full/path/to/myfileAutosys触发作业后,查看
/tmp/mail_debug.log和/tmp/mail_content.log,确认文件是否存在、内容是否完整,以此判断是文件未被读取还是内容为空。对比手动与Autosys的环境变量差异
手动执行和Autosys调度的环境变量可能存在差异,比如PATH、SENDMAIL相关配置。在脚本开头添加:env > /tmp/autosys_env.log手动执行脚本时也执行
env > /tmp/manual_env.log,对比两个日志的环境变量,重点关注PATH、MAIL、SENDMAIL等字段,必要时在脚本中显式设置缺失的环境变量。检查Autosys作业配置细节
确认Autosys作业的command字段是否正确引用脚本路径,若脚本路径包含空格或特殊字符,需用引号包裹;同时在作业配置中指定stdout_file和stderr_file,捕获脚本执行时的隐藏错误,比如:stdout_file: /tmp/autosys_job_stdout.log stderr_file: /tmp/autosys_job_stderr.log查看这些日志,可能会发现sendmail执行时的隐性报错。
模拟Autosys环境手动测试
切换到Autosys作业的运行用户,cd到Autosys作业的默认工作目录(可从Autosys配置或作业日志中获取),手动执行脚本,验证是否能正常发送邮件。如果此时也出现问题,说明是环境差异导致,而非Autosys调度逻辑的问题。
内容的提问来源于stack exchange,提问作者Vikram Tejaswi

