我正在尝试创建一个 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
并在后台执行它,因为有 & 符号&
。
因此,对您的问题的直接回答是最常见的:它没有“工作”(没有做您想要的事情),因为它正在工作(执行您命令的事情)。
使固定:
任何一个
{ /root/bin/sunwait sun up -0:00:00 54.453158N 11.013071E; mycommand; } &
或者
/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 ) &
我相信后一个例子就是您想要实现的,因为第一个例子将立即启动两个命令并将它们置于后台。