为什么“nohup”和“disown”在 SoX 上不起作用(调用为“play”)

为什么“nohup”和“disown”在 SoX 上不起作用(调用为“play”)

我可以运行这个命令:

$ play mylist.m3u

音乐响起。

然后,我可以按 Ctrl-Z 暂停作业,并发出命令bg让它在后台运行。

但是,如果我随后运行disownexit,音乐就会停止播放,即使该play命令仍然显示在 中ps

我希望音乐能够继续播放。

也很有趣

我运行命令

$ play mylist.m3u &

音乐确实不是玩。作业显示为stopped状态。

我也可以运行命令

$ nohup play mylist.m3u &

并且没有音乐播放 - 工作立即停止。

然而,

$ nohup play mylist.m3u

确实有音乐播放,但我不能像以前一样否认它。


似乎所有这些都是相关的。

大多数程序在disowned 或运行时都表现良好nohup,但 SoX 则不然。

有谁知道为什么?

答案1

对于像我这样的罕见人来说,都遇到了这个问题,并最终设法在谷歌上搜索与棒球*无关的内容并想要一个实际的解决方案:

$ play whatever.wav &>/dev/null </dev/null &

它在后台运行而不停止。

* 这红色红袜队波士顿的棒球,显然有些球员更喜欢成为众人瞩目的焦点,而不是背景。叽。

答案2

SoX 想要/需要输入和输出...通过在控制台中输入“play xxxx”,您可以正常运行它,并且标准输入和标准输出(和标准错误)都已连接。

当您将作业置于后台(使用 &)时,它会启动,然后暂停,因为它正在等待访问标准输入和标准输出。

当你“nohup”一份工作时,也会发生同样的事情。如果它需要键盘输入,它会“阻塞”,并被系统暂停,直到它接收到标准输入的访问权限。

否认一个进程可以有效地将其与连接到启动该进程的控制台的标准输入和标准输出切断。

它仍在“运行”,但被系统阻止(暂停),因为它正在等待访问标准输入和标准输出。

答案3

还可以使用 -q 选项来确保 SoX 不会写入 std-what,而不重定向到 /dev/null。

$ play filename -q &

相关内容