【问题标题】:Unable to execute a bash script in background from another bash script无法从另一个 bash 脚本在后台执行 bash 脚本
【发布时间】:2014-05-07 23:32:48
【问题描述】:

我有一个 shell 脚本,我想从另一个 shell 脚本在后台调用它。这两个脚本都是 bash 脚本。
第一个脚本(a.sh)类似于:

read a
echo 'something'
read b
echo 'something else'
# some if else conditions
nohup bash b.sh 2>&1 > /tmp/log &

当我尝试执行上述脚本时:./a.sh arg1 arg2 | tee log ,非常奇怪的是,它卡在 nohup 行以使第二个脚本 b.sh 完成,而它不应该完成。

但是当我只是在脚本中有以下行时,它会按预期工作:
nohup bash b.sh 2>&1 > /tmp/log &

请帮忙。如果需要,我还可以分享确切的脚本。

【问题讨论】:

  • 没有卡住,直接回车。
  • 没有。它卡住了。卡住是指它等待第二个脚本完成。显然按回车会在标准输出中插入一个新行,但它不在第一个脚本之外。
  • 试试这个 nohup 命令:nohup bash b.sh > /tmp/log 2>&1 &
  • 成功了!非常感谢。但我仍然无法理解为什么会这样。当同一行出现在单独的脚本中时(没有其他行)为什么它在那里工作而不是在这里工作。有什么建议吗?
  • 不确定您使用的是哪个脚本,但我已经为您提供了正确的语法

标签: linux bash shell ubuntu background


【解决方案1】:

这就是你想要发生的事情:

  1. 脚本运行并输出内容
  2. 脚本在后台运行命令
  3. 脚本退出
  4. 管道关闭
  5. tee 退出

这是正在发生的事情:

  1. 脚本运行并输出内容
  2. 脚本在后台运行命令,管道为标准错误
  3. 脚本退出
  4. 后台命令仍使管道保持打开状态
  5. tee 永不退出。

您通过将 stderr 指向日志文件而不是管道来修复它,以便后台进程不再保持管道打开。

2>&1 的顺序和重定向的含义一直是explained in other answersshellcheck 会在你的代码中自动指出这个问题。

【讨论】:

  • 谢谢!这正是我所需要的。将来会处理订单。
猜你喜欢
  • 2015-05-11
  • 1970-01-01
  • 1970-01-01
  • 2016-02-18
  • 2023-01-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多