7

TCP サーバーなどを含む Qt アプリケーションを開発しました。現在、Ubuntu パッケージを作成して、起動時にアプリケーションを自動的に起動しようとしています。

誰もログインしていなくても、アプリケーションは実行されている必要があります。つまり、/etc/init.d/ のスクリプトを介してデーモンが開始されます。

init.dスクリプトで、開始時にアプリケーションを実行し、停止時にkill-signalを送信するだけでしたが、それはアプリケーションがフォアグラウンドで実行され、init-scriptをブロックすることを意味します。

他の質問のようなフォークはほとんどうまくいくようですが、TCP サーバーを起動しようとすると「不明なエラー」が発生します。それでも、さまざまな Linux ディストリビューションの起動時にバックグラウンドでアプリケーションを実行する init-script を簡単に作成できる方法があるはずです。

誰かが私を正しい方向に向けることができますか?

Qt 4.5 で Ubuntu 9.10 を使用する

4

5 に答える 5

2

おそらく最良の方法は、フォークの作業が行われるQtServiceを使用することです。

ただし、引き続き独自のビルドを行いたい場合は、アプリケーションをバックグラウンドで実行するか、 OpenRCに付属の start-stop-daemonまたはディストリビューション用の同様のユーティリティを介して実行する必要があります。

また、QtCore 共有ライブラリにのみリンクしていることを確認してください。アプリケーションがコマンド ラインであり、GUI を表示しない場合でも、アプリケーションを実行するために X が必要ないというわけではありません。たとえば、単体テストのセット:

$ ldd runTests  | grep Qt
libQtTest.so.4 => /usr/lib/qt4/libQtTest.so.4 (0x00007fd424de9000)
libQtXml.so.4 => /usr/lib/qt4/libQtXml.so.4 (0x00007fd424baa000)
libQtGui.so.4 => /usr/lib/qt4/libQtGui.so.4 (0x00007fd4240db000)
libQtCore.so.4 => /usr/lib/qt4/libQtCore.so.4 (0x00007fd422644000)

QtGui が存在するため、上記の出力から除外されていますが、すべての X ライブラリも取り込まれます。

于 2009-08-18T00:32:37.567 に答える
1

デフォルトのランレベルに応じて、/etc の下の任意の rc?.d ディレクトリにシンボリック リンクを追加する必要があります。または update-rc.d スクリプトを使用します。最初に、アプリケーションを実行するスクリプトを /etc/init.d に作成する必要があります。次に、update-rc.d スクリプトを使用して、起動に必要なファイルを追加します。

update-rc.d マニュアルページを読むことで、それを行う方法に関する情報を見つけることができます:

$man update-rc.d
于 2009-07-05T14:49:38.727 に答える
1

あなたのプログラムは GUI アプリケーションですか、それとも GUI なしで動作しますか?

& を使用して init スクリプト内でバックグラウンドにしないのはなぜですか?

于 2009-07-05T14:26:45.577 に答える
0

最も簡単な方法は、アプリケーション自体にデーモンロジックを持たないことです。代わりに、ヘルパープログラムを使用して、アプリをバックグラウンドで起動し、そのpidを管理します。

たとえば、startprocです。

于 2009-08-18T00:42:27.573 に答える
0

インスピレーションを得るために、既に用意されている多くのスクリプトを参照できます/etc/init.dstartproc私が見たところによると、標準の Linux デーモンのほとんどは、起動とkillproc停止をに依存しています。

于 2013-06-03T23:33:36.283 に答える