如何在后台启动一个程序

如何在后台启动一个程序

该程序鲍勃莱特不在后台运行。执行之间没有明显差异

sudo boblightd

sudo boblightd& 

如何解决控制台不会阻止进一步输入的问题?

pi@raspberrypi ~/boblight/boblightd-for-raspberry-master $ sudo boblightd
Boblightd 2.0 (optimized version for raspberry) (c) 2013 Speedy1985 and Heven)
(InitLog)                       start of log /root/.boblight/boblightd.log
(PrintFlags)                    starting boblightd
(CConfig::LoadConfigFromFile)   opening /etc/boblight.conf
(CConfig::CheckConfig)          checking config lines
(CConfig::CheckConfig)          config lines valid
(CConfig::BuildConfig)          building config
(CConfig::BuildConfig)          built config successfully
(main)                          starting devices
(CClientsHandler::Process)      opening listening TcpSocket on *:19333
(CDevice::Process)              ambilight: starting with output "/dev/spidev0.0"
(CDevice::Process)              ambilight: setting up
(CDevice::Process)              ambilight: setup succeeded


pi@raspberrypi ~/boblight/boblightd-for-raspberry-master $ sudo boblightd&
[1] 2289
pi@raspberrypi ~/boblight/boblightd-for-raspberry-master $
Boblightd 2.0 (optimized version for raspberry) (c) 2013 Speedy1985 and Heven)
(InitLog)                       start of log /root/.boblight/boblightd.log
(PrintFlags)                    starting boblightd
(CConfig::LoadConfigFromFile)   opening /etc/boblight.conf
(CConfig::CheckConfig)          checking config lines
(CConfig::CheckConfig)          config lines valid
(CConfig::BuildConfig)          building config
(CConfig::BuildConfig)          built config successfully
(main)                          starting devices
(CClientsHandler::Process)      opening listening TcpSocket on *:19333
(CDevice::Process)              ambilight: starting with output "/dev/spidev0.0"
(CDevice::Process)              ambilight: setting up
(CDevice::Process)              ambilight: setup succeeded

答案1

您的后台命令显示它有效之后[1] 2289,并且确实已放入后台。

但是,除非您重定向,否则命令的输出仍然会发送到终端。这是执行此操作的综合方法:

sudo boblightd >std.txt 2>err.txt &

如果您希望 stdout 和 stderr 都转到同一个文件:

sudo boblightd >std.txt 2>&1 &

当然,如果您不关心其中一个或两个流的输出,则可以发送 to/dev/null而不是文件名。

sudo boblightd >/dev/null 2>err.txt &

(该示例丢弃了标准输出,但保留了 stderr,以防万一出现问题。)


更新

以上内容基于对 boblightd 是什么一无所知。我在另一个答案中看到它有一个守护进程模式,因此在这种情况下应该使用它。

顺便说一句,上面假设sudo不会提示输入密码,并且您不会关闭终端窗口。对于前者,我个人通常使用sudo bashthen,会输入boblightd >std.txt 2>err.txt &.另一种方法是执行sudo ls一些无害的命令来确保访问被缓存。

对于后者,nohup这是一个神奇的命令,可以确保即使在您离开大楼后它仍然保持运行。它会在sudo实际命令之后和之前。例如sudo nohup boblightd >std.txt 2>err.txt &。或者sudo bashthen nohup boblightd >std.txt 2>err.txt &, then exit(离开 root shell)。

答案2

我认为你可以像这样使用 nohup 命令:

nohup sudo boblightd &

这会将命令的输出放入当前目录中的 nohup.out 文件中。

您也可以使用这样的 screen 命令:首先创建一个屏幕:

screen -S your-sreen-name

然后运行你的命令:

sudo boblightd

要保存屏幕并返回到终端,请键入Ctrl+AD(是您想要执行某操作Ctrl+A的提示,然后“d”从会话中分离而不停止它)。screenD

恢复你的屏幕:

screen -d -r your-screen-name

答案3

您必须将 stdout 和 stderr 重定向到默认值以外的其他位置才能隐藏它们。 @devnull 的评论展示了如何做到这一点。这是第一步。

如果你只是简单地使用&分离你的程序,当你注销时它会自动被杀死。这可能不是你想要的。您必须使用以下nohup命令来防止这种情况:

nohup sudo boblightd > boblight.out 2> boblight.err < /dev/null &

请注意,它sudo可能会要求输入密码:它不会得到任何密码,并且您不会注意到它要求您输入密码,因为每个输出/输入都会被重定向。无论如何,您有不同的解决方案来实现这一目标:

  • sudo之前运行命令,sudo将保存您的密码。这就是快速又肮脏的方法。
  • 删除&,提供sudo密码,然后使用 将该进程发送到后台CTRL + Z
  • 还可以将 sudo 配置为不询问该特定用户和可执行文件对的密码。请注意,这可能是一个可能的安全漏洞,……

答案4

因为答案已经在评论中列出了。我觉得最好对其进行一些解释作为实际答案。

所以要走的路是: sudo boblightd > /dev/null 2>&1 &

这里有3个重要的部分。最重要的是&在行尾。它使 shell 在交还控制权之前不等待命令结束。它还从键盘取出标准输入。它将工作置于后台。

但这仍然会将输出返回到控制台。为了防止这种情况,有>一个符号可以重定向标准输出(/dev/null在本例中为重定向)。

此时,您仍然可以从调用的命令 get to screen 获取输出。这将是标准错误。最后还有2>&1魔法。这会将输出从标准错误流重定向到标准输出。

2来自1标准文件描述符。0将是stdin1-stdout,2-stderr。

如果需要,您可以将输出重定向到文件。

有一些命令旨在与后台作业交互。jobsfg

screen如果需要,您还可以使用更高级的解决方案,例如命令。

相关内容