【问题标题】:Scripts with nohup inside don't exit correctly内部带有 nohup 的脚本无法正确退出
【发布时间】:2015-04-17 21:36:47
【问题描述】:

我们有脚本,它使用 nohup 在后台进行一些处理并触发工作。当我们从 Oracle OEM 调度这个脚本(或者它可以是任何调度程序作业)时,我看到以下错误并将状态显示为失败,但脚本实际上完成没有问题。使用 nohup 启动备份地面作业时如何正确退出脚本?

Remote operation finished but process did not close its stdout/stderr

文件:test.sh

#!/bin/bash
# do some processing
...
nohup ./start.sh 2000 &

# end of the script

【问题讨论】:

标签: bash shell nohup


【解决方案1】:

通过以这种方式执行start.sh,您允许它声明对test.sh 的输出文件描述符(stdout/stderr)的部分所有权。因此,当大多数 bash 脚本退出时,它们的文件描述符(由操作系统)为它们关闭,test.sh 的文件描述符不能被关闭,因为start.sh 仍然拥有它们的所有权。

解决方案是不要让start.sh 声明与test.sh 使用的输出文件描述符相同的输出文件描述符。如果你不关心它的输出,你可以这样启动它:

nohup ./start.sh 2000 1>/dev/null 2>/dev/null &

告诉新进程将其标准输出和标准错误发送到/dev/null。如果您确实关心它的输出,那么只需在更有意义的地方捕获它:

nohup ./start.sh 2000 1>/path/to/stdout.txt 2>/path/to/stderr.txt &

【讨论】:

  • 我试过了,但在完成作业后仍然出现同样的错误。#Startup MMLE services, $ADMIN_SCRIPTS_HOME/wmlke.sh start 10218 $ADMIN_SCRIPTS_HOME/wmlke.sh start 10220 $ADMIN_SCRIPTS_HOME/wmlke.sh start 10222 nohup $ADMIN_SCRIPTS_HOME/wmlke.sh start_dispatcher 10809 1>/dev/null 2>/dev/null &
  • 你接受了我的回答。这是否意味着它最终为你工作?还是您还有问题?
  • 在将输出文件描述符添加到其他命令后现在也可以使用。
  • 为我工作。谢谢。花了一整天的时间试图找出我远程执行的脚本为什么挂起。
猜你喜欢
  • 1970-01-01
  • 2015-07-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-23
  • 1970-01-01
  • 1970-01-01
  • 2021-01-11
相关资源
最近更新 更多