私の主な質問は、デーモン(upstartスクリプト)を介してOPENGLプログラムを実行することは可能ですか?プログラムは画面にウィンドウを表示します。
詳細:デーモンで実行したいopenglプログラム(openframeworks、C ++で実行)があります。
手動で次のようにターミナルでプログラムを起動します。
planeviz@planeviz:~/src/of/apps/myApps/planeEtoiles/bin$ ./planeEtoiles
ここで、アップスタートスクリプト(/etc/init/myapp.conf)を作成しました。このスクリプトは、コンピューターの起動時にプログラムを起動し、クラッシュした場合は必ず再起動する必要があります。
# job file
description "myapp"
author "eva"
# When to start the service
start on startup
start on runlevel [2345]
# When to stop the service
stop on runlevel [016]
# Automatically restart process if crashed
respawn
# Start the process
script
sudo /home/planeviz/src/of/apps/myApps/planeEtoiles/bin/planeEtoiles
end script
次に、次の方法でデーモンを起動しようとします
sudo service myapp start
アプリケーションが開きません。dmesg教えてください:
planeviz@planeviz:/etc/init$ dmesg | grep "init:"
[ 5282.003496] init: myapp main process (8008) terminated with status 139
終了ステータス139は、セグメンテーション違反を示唆しているようです。upstartログのプログラムの出力を見ると、openglウィンドウの作成に関連する最後のエラーが表示されます。
planeviz@planeviz:/etc/init$ sudo tail /var/log/upstart/planeetoiles.log
....
[ error ] ofAppGLFWWindow: couldn't init GLFW
これは、upstartでOPENGLプログラムを実行することさえ可能かどうか、またはそれがバックグラウンドプロセスでのみ動作することを意図しているのかどうか疑問に思います。
Upstartはシステムサービス用に設計されています。(少なくとも最近のバージョンでは)ユーザーセッション中に実行されるコマンドを監視するためにそれを使用できますが、それは不器用です。
Upstartを使用すると、GUIウィンドウを表示するサービスを実行する場合、そのサービスはログインしている間のみ実行できます。ランレベルに基づいて開始および停止するのではなく、GUIのログインおよびログアウトイベントに基づいて開始および停止する必要があります。 。
start on desktop-session-start
stop on desktop-shutdown
また、ディスプレイにアクセスできるようにするためのサービスも必要です。GUIアプリケーションは、DISPLAY
環境変数を使用して、表示する場所を決定します。通常の状況では、GUIセッションはと呼ばれるディスプレイになります:0
。
env DISPLAY=:0
アプリケーションは、ディスプレイにアクセスするための許可も取得する必要があります。この権限は、GUIセッションの開始時に自動的に生成され、.Xauthority
ホームディレクトリ内のファイル(またはXAUTHORITY
ディスプレイマネージャによっては環境変数で示される別のファイル)に保存される「Cookie」(パスワード)の形式を取ります。ディスプレイマネージャが使用~/.Xauthority
し、ユーザーとしてサービスを実行する場合(とにかく実行する必要があります)、を設定する必要はありませんXAUTHORITY
。詳細については、「rootとして別のユーザーのデスクトップでグラフィカルプログラムを起動できますか?」を参照してください。およびリモートXディスプレイでウィンドウを開く(「ディスプレイを開けない」理由)?
setuid evsc
Upstartの代わりに、システムサービス管理ではなく監視のみを行う監視ツールを使用できます。プロセスが常に実行されていることを確認すると、いくつかの可能性がリストされます。デーモンツールsupervise
から使用してみましょう。どこかにディレクトリを作成します。例:。このディレクトリに、実行を継続するアプリケーションであるという実行可能ファイルを作成します。~/.planeEtoiles
run
mkdir ~/.planeEtoiles
ln -s /home/planeviz/src/of/apps/myApps/planeEtoiles/bin/planeEtoiles ~/.planeEtoiles/run
ログイン時に自動的に起動supervise ~/.planeEtoiles
するアプリケーションにコマンドを追加します。サービスを停止するには、svc
次のコマンドを使用します。
svc -t -x ~/.planeEtoiles
パズルの最後のピースは、svc
ログアウト時にそのコマンドを実行することです。この機能が欠落しているようです。そうでない場合は、文書化が非常に不十分です。GDMを使用している場合、から実行する回避策があり/etc/gdm/PostSession/Default
ますが、そのファイルはrootとしてコマンドを実行します。これは適切な解決策ではなく、Lightdmには適用されません。モニタースクリプトユーザーログアウト(root以外のユーザー)で実行し、どのように管理者権限を持っていない場合、私はGNOMEログアウト時にスクリプトを実行することができますか?ソリューションのために。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加