web-dev-qa-db-ja.com

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

プログラム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
9
user2534685

バックグラウンドコマンドの後の[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(ルートシェルを残す)。

22
Darren Cook

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
5
yanchong

Stdoutとstderrをデフォルト以外のものにリダイレクトして、それらを非表示にする必要があります。 @devnullのコメントは、これを行う方法を示しています。それが最初のステップです。

単に&を使用してプログラムを切り離すと、ログアウトしたときに自動的に強制終了されます。それはおそらくあなたが望むものではありません。これを防ぐには、Nohupコマンドを使用する必要があります。

Nohup Sudo boblightd > boblight.out 2> boblight.err < /dev/null &

Sudoはおそらくパスワードを要求することに注意してください。パスワードは取得されず、すべての出力/入力がリダイレクトされるため、パスワードの入力を要求していることに気付かないでしょう。とにかくこれを達成するためのさまざまなソリューションがあります。

  • 前にSudoコマンドを実行してください。Sudoはパスワードを保存します。それが簡単な方法です。
  • &を削除し、Sudoにパスワードを指定して、プロセスをバックグラウンドで送信します CTRL + Z
  • この特定のユーザーと実行可能なカップルのパスワードを要求しないようにSudoを構成することもできます。セキュリティ違反の可能性があることに注意してください…
4

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コマンドを使用してプロセスを実行したかのように、シェルを安全に終了できるようになりました

2
Chilledrat

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

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

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

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

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

2および1は、標準のファイル記述子からのものです。 0stdin1-stdout、2-stderrになります。

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

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

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

1
luk32