バックグラウンドでプログラムを開始する方法


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 2013年

学習目的でこれを行わない場合は、を使用してくださいdmenu。それはシンプルで、仕事はかなりうまくいきます。
Nishant 2018

回答:


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 bash、その後nohup boblightd >std.txt 2>err.txt &、その後、exit(rootシェルを終了します)。


sudoバックグラウンドプロセスがSTDINを読み取ることができないため、パスワードを要求しようとすると失敗することに注意することも重要です。
Patrick

@Patrickに感謝します。質問の差し迫った問題について答えたところですが、これが注目を集めているので、パスワードプロンプトとnohupについて言及して更新しました。
ダレン・クック

5

次のようにnohupコマンドを使用できると思います。

nohup sudo boblightd &

これにより、コマンドの出力が現在のディレクトリのnohup.outファイルに配置されます。

また、次のようなscreenコマンドを使用できます。最初に画面を作成します。

screen -S your-sreen-name

次に、コマンドを実行します。

sudo boblightd

画面を保存してターミナルに戻るには、次のように入力しますCtrl+ADCtrl+Aは、screen何かを実行したいというヒントであり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を構成することもできます。セキュリティ侵害の可能性があることに注意してください…

の前sudoか後のどちらかにnohupがある方が良いですか?sudo下で実行するときにパスワードを取得するにはどうすればよいnohupですか?
アーロンディグラ2013年

1
まあ、それは良い点です:それはしません。ここには複数の解決策があります。前にsudoコマンドを実行すると、sudoがパスワードを保存します。それが簡単な方法です。もう1つは、を削除し&sudoパスワードを指定して、でプロセスをバックグラウンドに送信することctrl + zです。sudoこの特定のユーザーと実行可能なカップルのパスワードを要求しないように構成することもできます。

(私はこれを答えに追加しました。)

通常はsudo bashを実行してnohupから、新しいシェル内からコマンドを実行します。

実際、&バックグラウンドで実行するプロセスのみを使用すると、ログアウト時に強制終了されるプロセスは正しくありません。bashがSIGHUPで強制終了された場合にのみ、プログラムをSIGHUPします。ただし、ログアウトしてもSIGHUPは発生しません。入力するlogoutか、CTRL + Dを使用すると、bashは終了し、プロセスを実行したままにします。SIGHUPは、GUIでターミナルエミュレータを閉じると送信されます。
Patrick

2

ボブライト

boblightdの場合、stderrに送信された出力は既にそのログファイルにキャプチャされているため(デフォルトでは〜/ .boblight / boblightd.log)、キャプチャする必要はなく、破棄することができます。また、boblightはデフォルトではforkしませんが、コマンドに-fを含めることで実行できます。

以下を試してみることをお勧めします:

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

プロジェクトドキュメントの詳細)

より一般的に

シェルから開始されたプロセスは、シェルが終了すると終了します。他の人がCtrl-Zフォアグラウンドでプロセスを実行しているときに使用すると指摘したように、制御はシェルに戻ります。ただし、この時点でプロセスは停止状態になります。bg コマンドを再び実行しているプロセスを取得しますが、背景に滞在するために必要とされます。プロセスIDまたはジョブ番号のいずれかが必要です(通常、ジョブ番号の前には%が付きます)。2番目の例を使用すると、次のいずれかを発行します。

bg %1

または

bg 2289

これでプロセスはバックグラウンドで実行されますが、まだシェルに接続されています。シェルへのリンクは、disownコマンドを使用して切断できます。これにより、nohup / sudoとの混乱を回避できます。と同様にbgdisownプロセスIDまたはジョブ番号のみが必要です

例えば

disown 2289

nohupコマンドでプロセスを実行したかのように、シェルを安全に終了できます。


1

答えはすでにコメントでかなりレイアウトされているので。実際の回答として少し説明をつけていただければと思いました。

だから行く方法は: sudo boblightd > /dev/null 2>&1 &

ここには3つの重要な部分があります。最も重要なのは&行末です。これにより、シェルはコマンドの終了を待たずに制御を戻します。また、キーボードから標準入力を取り出します。ジョブをバックグラウンドにします。

ただし、これでも出力はコンソールに残ります。これを防ぐために>、標準出力(/dev/nullこの場合は)にリダイレクトするシンボルがあります。

この時点でも、呼び出されたコマンドget to screenから出力を取得できます。これは標準エラーになります。最後に2>&1魔法があります。これにより、標準エラーストリームからの出力が標準出力にリダイレクトされます。

2そして、1標準のファイルディスクリプタから来ます。0なりstdin1- STDOUT、2-標準エラー出力。

必要に応じて、出力をファイルにリダイレクトできます。

バックグラウンドでジョブと対話するように設計されたコマンドがあります。jobsfg

screen必要に応じて、コマンドなどのより高度なソリューションを試すこともできます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.