バックグラウンドでのLinuxプロセスの開始


10

一部のプログラムを開始するスクリプトを作成しようとしています

startup.sh

knetworkmanager
emesene
keepassx

問題は、スクリプトを実行すると、knetworkmanagerのみが起動することです。これはそれを開始し、終了するまで待つためです。プログラムを待たずに開始するにはどうすればよいですか?スクリプトが終了してもすべてのプロセスが強制終了されるため、各コマンドの後に単に「&」を追加することはできないと思います。

回答:


16

スクリプトを実行するシェルが終了すると、起動したプロセスにHUPシグナルが送信されます。それらがシグナルをキャッチしない場合、それらは終了します。したがって、&を使用するだけで十分かどうかは、アプリケーションによって異なります。安全のために、そのようなnohupを使用してください:

nohup your-program >>/dev/null 2>>/dev/null &

詳細については、nohupとkillのマニュアルページを参照するか、nohupに関するウィキペディアの記事を参照してください。


繰り返しますが、OPが呼び出し側シェルを終了するかどうかはあいまいです。彼はスクリプトの終了についてのみ言及し、シェルやターミナルからの終了については言及していません。
アダムベレア

もう一度私の回答を読むと、「スクリプトを実行するシェルが終了したとき」と言ったことに気づくでしょう。このシェルに独自の仮想端末(サブシェルなどではない)があると仮定すると、これは正しいです。

@キム:そうだね。あなたの答えは結構です。OPが呼び出し側のシェルを閉じているかどうかは確かです。
アダムベレア

10

いいえ、を使用して&いる場合、スクリプトが終了してもプロセスは強制終了されません。それを試してみてください。

knetworkmanager &
emesene &
keepassx &

2

あなたが与えたサンプルプログラムに基づいて、KDEが起動したときにいくつかのプログラムを起動しようとしているようです。もしそうなら、KDEの自動起動機能を見てください。この記事では、詳細について説明し、プログラムを自動起動に追加する方法について説明します。


確かに、それは私がやろうとしていることです。直しました、ありがとう。
Bart van Heukelom

1

他の人が言っ&たように、シェルを実行するときに、オペレーターを使用してコマンドをバックグラウンドに入れます。

コンポーネントパーツを(同時にではなく)順序どおりに実行したいが、全体をバックグラウンド化したい場合は、次のようなサブシェルを使用します。

(knetworkmanager; emesene; keepassx) &

または、各パーツの操作を前のパーツの正常な完了を条件とする場合は、次のようにします。

(knetworkmanager && emesene && keepassx) &

0

各コマンドの後に「&」を追加すると確実に機能します。つまり、startup.shが終了した後でも、これらのスクリプトまたはプログラムは引き続き実行されます。


0

別のオプションは、/ sbin / start-stop-daemonを使用して、プロセスをデーモンとして開始することです。

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