systemdは起動後にきれいな端末で実行されているプログラムを自動的に開くことができますか?

systemdは起動後にきれいな端末で実行されているプログラムを自動的に開くことができますか?

まず、簡単な質問についてお詫び申し上げます。以下で詳しく説明します。

私はLinuxスタイルのシステムに初めて触れました。たくさん勉強する

これを入れてみてください...

私のシステム

私はRaspberry Pi 4 Model Bでプログラムを実行しています。私のオペレーティングシステムはRaspbian GNU / Linux 10(buster)です。

私が所有しているもの

home/pi/Devプログラムは無限に繰り返されます(空のforループを使用)。

Geany(piのエディタ)でプログラムを起動すると、新しいターミナルウィンドウを開き、そこから出力を印刷するプログラムを作成して実行できます。

フォルダ内の実行可能ファイルをクリックすると、「実行」と「ターミナルで実行」から選択するように求められます。

  • 「実行」を選択しても何の効果もないようです。 (タスクマネージャでプロセスを探していますか?)

  • 「ターミナルで実行」を選択するとエラーになります。Failed to execute child process “xterm” (No such file or directory)

端末を使用し、./myprogramプログラムの実行中にプログラムを実行して、開いている端末ウィンドウに出力を印刷します。

私が望むもの

プログラムの起動時に自動的に実行するようにしたいと思います。

Piは「ヘッドレス」として使用されますが、グラフィカルインターフェイスが有効になり、VNCを使用してデスクトップを表示できます。 VNC接続を開くと、ターミナルが実行され、プログラム出力を表示したいと思います。

私が試したこと

私はプログラムを起動するためにsystemdを使用しようとしてきました。

最初はプログラムを直接起動しようとしましたが、オンラインで良い情報や例が見つかりませんでした。ほとんどの例ではbashまたはPythonスクリプトを使用しています...勝つことができない場合は参加してください。 ..

次に、usr / local / bin /に次の単純なbashスクリプトを作成(コピー)しましたprocamStartup.sh

#!/bin/bash
echo test
cd /home/pi/Dev/
./Procam

を使用してこのスクリプトを実行すると、./procamStartup.sh端末に「test」が印刷され、その下にプログラムが印刷され始めます。だから私の目にはスクリプトが有効です。

次に、次のようなファイルを作成しましたservice/etc/systemd/system/procamStartup.service

[Unit]
 Description=Procam Startup Script
 After=graphical.target

 [Service]
 Type=idle
 ExecStart=/usr/local/bin/procamStartup.sh

 [Install]
 WantedBy=graphical.target

Type = idle始める前にシステムがすべてのプロセスが完了するのを待つように選択します。

WantedBy=graphical.targetグラフィカルインターフェイスが起動した後にのみプログラムを起動することを選択しました。

次のコマンドを使用して、スクリプトとサービスフォルダの実行権限を設定しました。

  • sudo chmod +x /usr/local/bin/procamStartup.sh

  • sudo chmod +x /etc/systemd/system/procamStartup.service

次に、systemdにファイルを再ロードするように指示します。

sudo systemctl daemon-reload

次に、起動時にスクリプトを実行するようにアクティブにします。

sudo systemctl enable procamStartup.service

そして私は逃げたsudo reboot

続ける

だから..この投稿を送信する前に、私は私の指示に従って以下を実行しました。

sudo systemctl status procamStartup.service

サービスが正常に実行されたことを報告し、プログラム出力をログに印刷します。

これはうまくいきます。プログラムの実行中に期待どおりにPiを使用できます。デフォルトでは出力は表示されません。

私の質問をもう一度実行してください。

systemdは起動後にきれいな端末で実行されているプログラムを自動的に開くことができますか?

また、プログラムを実行するスクリプトを実行するので、サービスファイルを変更する必要があると思います。同じプログラムの複数のインスタンスを起動することもできます。

読んでくれてありがとう。

続ける

今インストールしましたxterm

スクリプトを次のように変更しました。

#!/bin/bash
xterm -hold -e /home/pi/Dev/Procam

Pi GUI端末を介してこのスクリプトを実行すると、目的の結果が得られます。正しい出力を含む新しいウィンドウが表示されます。

起動またはSSHを介してこれを実行すると、次のエラーが発生します。

xterm: Xt error: Can't open display: %s

xterm: DISPLAY is not set

現在、この問題に対する解決策を見つけることに取り組んでいます。

答え1

希望の機能が得られるようになりました。

/usr/local/bin/()のスクリプトを編集しましたが、procamStartup.sh次のように表示されます。

#!/bin/bash
DISPLAY=:0 xterm -hold -e /home/pi/Dev/Procam

そして/etc/systemd/system/()procamStartup.serviceのサービスファイルを次のように編集します。

[Unit]
 Description=Procam Startup Script
 After=graphical.target

 [Service]
 Environment=XAUTHORITY=/home/pi/.Xauthority
 DISPLAY=:0
 User=pi
 Type=idle
 ExecStart=/usr/local/bin/procamStartup.sh
 User=pi
 Environment=XAUTHORITY=/home/pi/.Xauthority

 [Install]
 WantedBy=graphical.target

sudo systemctl daemon-reload再読み込み後、sudo rebootVNCに接続して自分のターミナルウィンドウでプログラムが実行されていることを確認できます。

金曜日に良いニュースですね:)

良い週末を過ごしてほしい!

関連情報