AIX环境下nohup/cron执行ksh脚本报‘Not a terminal’错误求助
问题分析与解决
错误原因
在nohup或cron环境下,运行进程没有关联终端(tty),而你执行su时调用了script命令——这个工具的作用是记录终端会话,必须依赖终端才能运行,因此会抛出“Not a terminal”错误。从错误日志的命令行可以明确看到这一点:
su - orabq3 -c script -q -c "export BACKUP_DIR=${BACKUP_DIR} && /usr/local/oracle/sap/SAParchive_nb.ksh sid=BQ3 > ${BACKUP_DIR}/BQ3_$(date +%Y%m%d%H%M%S).log 2>&1" /dev/null
你提供的脚本里没有显式使用script,推测是实际执行的脚本版本、或是SAParchive_nb.ksh内部调用了该命令,导致在无终端环境下触发错误。
解决步骤
1. 移除不必要的script命令
你已经通过> ${BACKUP_DIR}/...log 2>&1将备份脚本的输出重定向到日志文件,完全不需要额外用script记录会话。修改su执行的命令,去掉script相关部分:
将错误的命令形式:
su - "$owner" -c "script -q -c \"export BACKUP_DIR=${BACKUP_DIR} && /usr/local/oracle/sap/SAParchive_nb.ksh sid=$db > ${BACKUP_DIR}/${db}_\$(date +\%Y\%m\%d\%H\%M\%S).log 2>&1\" /dev/null"
替换为:
su - "$owner" -c "export BACKUP_DIR=${BACKUP_DIR} && /usr/local/oracle/sap/SAParchive_nb.ksh sid=$db > ${BACKUP_DIR}/${db}_\$(date +\%Y\%m\%d\%H\%M\%S).log 2>&1"
2. 适配无终端环境的su调用
AIX的su在无终端环境下,可能会因加载用户交互式shell配置(如.profile、.kshrc)出现问题,可以显式指定shell并避免加载不必要的配置:
su - "$owner" -s /bin/ksh -c "export BACKUP_DIR=${BACKUP_DIR} && /usr/local/oracle/sap/SAParchive_nb.ksh sid=$db > ${BACKUP_DIR}/${db}_\$(date +\%Y\%m\%d\%H\%M\%S).log 2>&1"
3. 检查备份脚本内部依赖
如果修改后仍报错,需要排查SAParchive_nb.ksh是否存在依赖终端的操作(比如调用tty命令、使用需要终端的交互工具),若有则同步修改这些逻辑。
4. 验证修改效果
用nohup命令测试修改后的脚本:
nohup ksh -xv b.ksh > b.out &
查看b.out日志确认错误是否消除。
完整修改后的脚本片段
# Switch user and execute backup script su - "$owner" -s /bin/ksh -c "export BACKUP_DIR=${BACKUP_DIR} && /usr/local/oracle/sap/SAParchive_nb.ksh sid=$db > ${BACKUP_DIR}/${db}_\$(date +\%Y\%m\%d\%H\%M\%S).log 2>&1" # Remove the lock file rm "${BACKUP_DIR}/${db}_backup.lck"
内容的提问来源于stack exchange,提问作者Saurabh Thakuria
相关产品推荐
相关产品推荐

