通过 Bash 脚本强制进程进入后台

通过 Bash 脚本强制进程进入后台

我正在尝试创建一个 bash 脚本,其中包括启动 sunwait:

/root/bin/sunwait sun up -0:00:00 54.453158N 11.013071E; mycommand &

Sunwait 是一个二进制文件,它会等待天文事件发生后再执行给定的命令。我在末尾使用了 & 符号将其发送到后台,这样我的脚本就可以继续执行其他操作,但这不起作用,我不知道为什么。

直接在 shell 上执行该命令也不会将 sunwait 发送到后台。我也尝试了 nohup,但没有成功。

我使用的是 Ubuntu 14.04 Server LTS。为什么它无法运行?

答案1

Sunwait 是一个二进制文件,它会等待天文事件发生后再执行给定的命令。

检查了您的语法后,我猜这种解释是错误的。在您的示例中,它sunwait什么都不执行,实际上没有给它任何命令。我不熟悉sunwait,但快速研究后我发现它只是等待天文事件然后完成。

对于你来说,它是这样的:

  • shell 读取该行,遇到分号;并执行到该点的所有内容 —— 这就是sunwait其命令行选项。
  • 外壳等待sunwait完成。
  • 最终sunwait完成,因此 shell 继续mycommand并在后台执行它,因为有 & 符号&

因此,对您的问题的直接回答是最常见的:它没有“工作”(没有做您想要的事情),因为它正在工作(执行您命令的事情)。

使固定:

  1. 任何一个 { /root/bin/sunwait sun up -0:00:00 54.453158N 11.013071E; mycommand; } &

  2. 或者 /root/bin/sunwait sun up -0:00:00 54.453158N 11.013071E && mycommand &

在第一行中,两个命令{}看起来&就像是单个命令,所以一切都进入后台。简单而且通常足够好。第二种情况略有不同:mycommand当且仅当sunwait无错误完成时才会运行(除非sunwait编码不当)。这是你一开始就期望的行为,不是吗?我个人认为第二种修复方法更优雅。想象一下你输入错误mycommand,过了一会儿才意识到这是一颗定时炸弹。sunwait在第一种情况下,杀死会触发炸弹,在第二种情况下,拆除它。

答案2

您的行有两个命令,以分号 ( ;) 分隔。您需要将两个命令都发送到后台:

/root/bin/sunwait sun up -0:00:00 54.453158N 11.013071E & mycommand &

或者,如果您想要命令一个接一个地运行,请在子 shell 和后台运行它们:

( /root/bin/sunwait sun up -0:00:00 54.453158N 11.013071E; mycommand ) &

我相信后一个例子就是您想要实现的,因为第一个例子将立即启动两个命令并将它们置于后台。

相关内容