如何在后台启动程序


9

程序Boblight不在后台运行。执行之间没有明显的区别

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

8
说:sudo boblightd > /dev/null 2>&1 &
devnull

如果您不是出于学习目的这样做,请使用dmenu。它很简单,做得很好。
Nishant '18年

Answers:


22

[1] 2289后你的背景命令显示它的工作,并确实投入的背景。

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

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

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

sudo boblightd >std.txt 2>&1 &

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

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

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


更新

上面的内容不知道什么是坏蛋。我在另一个答案中看到它有一个守护程序模式,因此在这种情况下应该使用它。

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

对于后者,nohup是一个魔术命令,以确保即使您离开建筑物,它也能保持运行。它将sudo在实际命令之后和之前。例如sudo nohup boblightd >std.txt 2>err.txt &。或sudo bashnohup boblightd >std.txt 2>err.txt &,则exit(离开root的shell)。


还必须注意,如果sudo尝试提示输入密码,它将失败,因为后台进程无法读取STDIN。
帕特里克

谢谢@帕特里克。我刚刚回答了问题中的紧迫问题,但是由于这引起了一定的关注,我已经更新了有关密码提示和nohup的内容。
Darren Cook

5

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

nohup sudo boblightd &

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

您也可以使用如下屏幕命令:首先创建一个屏幕:

screen -S your-sreen-name

然后运行您的命令:

sudo boblightd

要保存屏幕并返回到终端,请键入Ctrl+ADCtrl+Ascreen要执行某操作的提示,D然后在不停止的情况下从会话中“ d”分隔)。

恢复屏幕:

screen -d -r your-screen-name

4

您必须将stdout和stderr重定向到默认值以外的其他位置才能隐藏它们。@devnull的注释显示了如何执行此操作。这是第一步。

如果仅使用它&来分离程序,则注销时该程序将自动被杀死。那可能不是您想要的。您必须使用nohup命令来防止这种情况:

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

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

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

在之前之后进行Nohup更好sudo吗?sudo在以下环境下运行时,如何获取密码nohup
亚伦·迪古拉

1
好吧,这是一个好点:不会。您在这里有多种解决方案:之前运行sudo命令,sudo将保存您的密码。那是快速的'肮脏的方式。另一种方法是删除&,提供sudo密码,然后使用将该进程发送到后台ctrl + z。您还可以配置sudo为不询问该特定用户和可执行文件对的密码。

(我将其添加到答案中。)

我通常这样做sudo bash,然后nohup从新she​​ll内运行命令。

实际上,如果仅使用&后台进程,则该进程将在注销时被杀死是不正确的。只有使用SIGHUP杀死bash才会对您的程序进行SIGHUP。但是注销不会导致SIGHUP。如果键入logout或使用CTRL + D,bash将退出并保持进程运行。当您在GUI中关闭终端仿真器时,将发送SIGHUP。
帕特里克

2

疯了

对于boblightd,发送到stderr的输出已经在其日志文件中捕获了(默认为〜/ .boblight / boblightd.log),因此不需要捕获并可以将其丢弃。另外,默认情况下,boblight不会分叉,但可以通过在命令中包含-f来实现。

我建议您尝试以下方法:

sudo boblightd -f >/dev/null 2>/dev/null

(有关项目文档的详细信息)

更普遍

从外壳启动的进程将在外壳退出时终止。正如其他人指出的那样Ctrl-Z,在前台运行进程时使用会将控制权返回给Shell。但是,此时,进程处于停止状态bg 将需要该命令来使进程再次运行,但仍处于后台。它需要一个进程ID或作业号(通常的作业号以%开头),因此使用第二个示例,您将发布

bg %1

要么

bg 2289

该进程现在将在后台运行,但仍附加在外壳程序上。可以使用以下disown命令切断指向shell的链接,该命令可以避免与nohup / sudo混淆。与一样bgdisown仅需要进程ID或作业号

例如

disown 2289

现在,您可以安全退出外壳程序,就像使用nohup命令运行该进程一样


1

由于答案已经在注释中列出了。我觉得最好在其上发布一些解释作为实际答案。

因此,方法是: sudo boblightd > /dev/null 2>&1 &

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

但这仍然会使输出返回控制台。为防止这种情况,有>符号将标准输出重定向到(/dev/null在这种情况下为)。

此时,您仍然可以从被调用命令的输出获取到屏幕。这将是标准错误。最后是2>&1魔术。这会将输出从标准错误流重定向到标准输出。

21来自标准文件描述符。0stdin1-标准输出2-标准错误。

您可以根据需要将输出重定向到文件。

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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.