プログラム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
バックグラウンドコマンドの後の[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
(ルートシェルを残す)。
Nohupコマンドは次のように使用できると思います。
Nohup Sudo boblightd &
これにより、コマンドの出力が現在のディレクトリのNohup.outファイルに配置されます。
また、次のようなscreenコマンドを使用できます。最初に画面を作成します。
screen -S your-sreen-name
次に、コマンドを実行します。
Sudo boblightd
画面を保存してターミナルに戻るには、次のように入力します Ctrl+AD (Ctrl+A 何かをしたいscreen
のヒントであり、 D その後、セッションを停止せずに「d」でセッションから切り離します。
画面を復元します。
screen -d -r your-screen-name
Stdoutとstderrをデフォルト以外のものにリダイレクトして、それらを非表示にする必要があります。 @devnullのコメントは、これを行う方法を示しています。それが最初のステップです。
単に&
を使用してプログラムを切り離すと、ログアウトしたときに自動的に強制終了されます。それはおそらくあなたが望むものではありません。これを防ぐには、Nohup
コマンドを使用する必要があります。
Nohup Sudo boblightd > boblight.out 2> boblight.err < /dev/null &
Sudo
はおそらくパスワードを要求することに注意してください。パスワードは取得されず、すべての出力/入力がリダイレクトされるため、パスワードの入力を要求していることに気付かないでしょう。とにかくこれを達成するためのさまざまなソリューションがあります。
Sudo
コマンドを実行してください。Sudo
はパスワードを保存します。それが簡単な方法です。&
を削除し、Sudo
にパスワードを指定して、プロセスをバックグラウンドで送信します CTRL + Z。Boblightd
boblightdの場合、stderrに送信された出力はすでにそのログファイルにキャプチャされています(デフォルトは〜/ .boblight/boblightd.log)、これはキャプチャする必要がなく、破棄することができます。また、boblightはデフォルトではforkしませんが、コマンドに-fを含めることでフォークできます。
以下を試してみることをお勧めします:
Sudo boblightd -f >/dev/null 2>/dev/null
(詳細 プロジェクトのドキュメントから )
より一般的に
シェルから開始されたプロセスは、シェルが終了すると終了します。他の人が使用して指摘したように Ctrl-Z フォアグラウンドでプロセスを実行している間、シェルに制御を返します。ただし、この時点でプロセスはstopped状態になります。 bg
コマンドは、プロセスを再度実行するために必要ですが、バックグラウンドのままです。プロセスIDまたはジョブ番号が必要です(通常、ジョブ番号の前には%が付きます)。2番目の例を使用すると、次のいずれかを発行します。
bg %1
または
bg 2289
これでプロセスはバックグラウンドで実行されますが、シェルに接続されたままです。シェルへのリンクは、disown
コマンドを使用して切断できます。これにより、Nohup/Sudoとの混乱を回避できます。 bg
と同様に、disown
にはプロセスIDまたはジョブ番号のみが必要です
例えば.
disown 2289
Nohup
コマンドを使用してプロセスを実行したかのように、シェルを安全に終了できるようになりました
答えはすでにコメントでかなりレイアウトされているので。実際の回答として少し説明をつけていただければと思いました。
だから行く方法は:Sudo boblightd > /dev/null 2>&1 &
ここには3つの重要な部分があります。最も重要なのは、行末の&
です。これにより、シェルはコマンドの終了を待たずに制御を戻します。また、キーボードから標準入力を取り出します。ジョブをバックグラウンドにします。
ただし、これでも出力はコンソールに戻ります。これを防ぐために、標準出力をリダイレクトする>
シンボルがあります(この場合は/dev/null
に)。
この時点で、呼び出されたコマンドget to screenから出力を取得できます。これは標準エラーになります。最後に、2>&1
マジックがあります。これにより、出力が標準エラーストリームから標準出力にリダイレクトされます。
2
および1
は、標準のファイル記述子からのものです。 0
はstdin
、1
-stdout、2
-stderrになります。
必要に応じて、出力をファイルにリダイレクトできます。
バックグラウンドでジョブと対話するように設計されたコマンドがあります。 jobs
およびfg
。
必要に応じて、screen
コマンドなどのより高度なソリューションを試すこともできます。