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

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

プログラムボブライトバックグラウンドで実行されません。実行間に大きな違いはありません

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 &

もちろん、1つまたは2つのストリームの出力に興味がない場合は、ファイル/dev/null名の代わりに送信できます。

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

(この例では標準出力を破棄しますが、問題が発生した場合に備えてstderrを維持します。)


修正する

上記は、boblightdが何であるかについての無知に基づいています。他の回答でデーモンモードがあることがわかったので、この場合に使用する必要があります。

ところで、上記は、sudoパスワードの入力を求められず、端末ウィンドウを閉じないことを前提としています。前者の場合は個人的にsudo bashthenを使用しますが、もう1つのアプローチはアクセスをキャッシュするために無害なコマンドを実行する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

答え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つの重要な部分があります。最も重要なのは&行の終わりにあります。これにより、シェルは制御を返す前にコマンドが完了するのを待たなくなります。また、キーボードから標準入力を取得します。ジョブをバックグラウンドにしておきます。

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

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

21標準ファイル記述子から。 -stdout、-stderrに0なります。stdin12

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

バックグラウンドタスクと対話するように設計されたいくつかのコマンドがあります。jobsそしてfg

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

関連情報