该程序鲍勃莱特不在后台运行。执行之间没有明显差异
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 bash
then,会输入boblightd >std.txt 2>err.txt &
.另一种方法是执行sudo ls
一些无害的命令来确保访问被缓存。
对于后者,nohup
这是一个神奇的命令,可以确保即使在您离开大楼后它仍然保持运行。它会在sudo
实际命令之后和之前。例如sudo nohup boblightd >std.txt 2>err.txt &
。或者sudo bash
then 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”从会话中分离而不停止它)。screen
D
恢复你的屏幕:
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
将是stdin
,1
-stdout,2
-stderr。
如果需要,您可以将输出重定向到文件。
有一些命令旨在与后台作业交互。jobs
和fg
。
screen
如果需要,您还可以使用更高级的解决方案,例如命令。