質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
systemd

systemdは、Linuxの起動処理及びシステム管理を行う技術です。他にも多くのサービス管理機能を備えており、ユーザープロセスを並列に起動しシステムの起動処理に要する時間を短縮できるなどの特徴があります。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

Raspberry Pi

Raspberry Piは、ラズベリーパイ財団が開発した、名刺サイズのLinuxコンピュータです。 学校で基本的なコンピュータ科学の教育を促進することを意図しています。

Q&A

1回答

8122閲覧

ラズパイでプログラムを自動起動したいが、cannot connect to X server エラーが発生

nao99

総合スコア10

systemd

systemdは、Linuxの起動処理及びシステム管理を行う技術です。他にも多くのサービス管理機能を備えており、ユーザープロセスを並列に起動しシステムの起動処理に要する時間を短縮できるなどの特徴があります。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

Raspberry Pi

Raspberry Piは、ラズベリーパイ財団が開発した、名刺サイズのLinuxコンピュータです。 学校で基本的なコンピュータ科学の教育を促進することを意図しています。

0グッド

2クリップ

投稿2020/08/24 08:18

編集2020/08/25 08:25

【実現したいこと】
ラズパイ起動時に、pythonプログラムを自動起動したい。

【発生している問題】
ログで、cannot connect to X server とエラーが発生するが、対処方法が分からない。

pi@raspberrypi:~ $ sudo systemctl start autostart.service
pi@raspberrypi:~ $ sudo systemctl status autostart.service
● autostart.service - do something
Loaded: loaded (/etc/systemd/system/autostart.service; enabled; vendor preset: enabled)
Active: failed (Result: exit-code) since Mon 2020-08-24 15:24:53 JST; 9s ago
Process: 2547 ExecStart=/home/pi/mause_xy.py (code=exited, status=1/FAILURE)
Main PID: 2547 (code=exited, status=1/FAILURE)

8月 24 15:24:52 raspberrypi systemd[1]: Started do something.
8月 24 15:24:53 raspberrypi mause_xy.py[2547]: : cannot connect to X server
8月 24 15:24:53 raspberrypi systemd[1]: autostart.service: Main process exited, code=exited, status=1/FAIL
8月 24 15:24:53 raspberrypi systemd[1]: autostart.service: Failed with result 'exit-code'.

【サービスファイル】
autostart.service

[Unit] Description=do something [Service] ExecStart=/home/pi/mause_xy.py [Install] WantedBy=multi-user.target

【やったこと】
ここに至る迄、いくつかのエラーが発生し、以下の対応を行った。
①permission error処置

cdmod 777 /home/pi/mause_xy.py

で、アクセス権を設定した。

②Exec format error
python ファイルの1行目に

#!/usr/bin/python3

を追記した。

③No such file or directory・・・・
改行コード修正のため、

sed -i 's/\r//' /home/pi/mause_xy.py

で修正を行った。

その結果、現在の状況となった。

ここまで来て進めなくなりました。

アドバイス宜しくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yasutakatou

2020/10/14 08:14 編集

コンソールからログインしてmouse_xy.pyを動作させると意図通り動くのですよね? であればX Server起動まで待たせるように変更してみては如何でしょうか。 [Unit]にAfter=graphical.targetを追記してみてください。 すみませんがこちらの記事にありますようにあらかじめXserverのサービス名を確認した方が良いです。 ディストリビューションごとに違う可能性がありえます https://qastack.jp/superuser/759759/writing-a-service-that-depends-on-xorg
nao99

2020/10/15 05:30

ご回答有難うございます。 [Unit]に、After=graphical.target を追記してみましたが、変化ありませんでした。 X serverのサービス名を調べたいのですが、graphical.target とは、GUI環境のこと、X serverはGUI環境ということでしょうか。調べ方もよくわかっていません。
yasutakatou

2020/10/15 05:44

>コンソールからログインしてmouse_xy.pyを動作させると意図通り動くのですよね? これは確認済みですよね。であればX11は自動起動で動いているので systemctl get-default で確認したターゲットをAfter=に書けば良さそうです。 または.timerというファイルを作って、起動後一定時間経ったあとに動かすこともできそうです。 https://unix.stackexchange.com/questions/397853/how-to-set-a-systemd-unit-to-start-after-loading-the-desktop
nao99

2020/10/15 07:22

コンソールから、mouse_xy.pyの動作は問題なく動作します。 systemctl get-default で確認しましたら、graphical.target でした。 こちらでは動作しませんので、.timer ファイルを確認してみます。
yasutakatou

2020/10/15 07:58

不思議ですね。。AfterなのでX11が起動するのを待ってから動作するので見つからないにはならないと 思うのですが、、となると環境変数でDISPLAYを設定するような箇所があってないのか。 みたいな話なのかなと思います。もし、.timerでうまくいかないのであればその線でさらに調査いたしますね!うまくいくといいですけど。。
guest

回答1

0

  1. ログを見る限りだと、autostart.serviceはラズパイ起動時に自動起動されているが、エラー終了している。
    (→質問のタイトルが間違っています。あなたがうまくいった後、同様なトラブルに遭った人の為に、タイトルを修正してください)

エラー終了の原因(のひとつ)はX serverが必要なアプリのようなのにX serverが起動されていない時点で起動されたから。
2. 対処方法
以下を参考にしてください
X Window System起動時にプログラムを自動的に実行するには
~/.xinitrc と ~/.xsession のどちらか、または両方に起動するプログラムを記述すればいいそうです。


① ターミナルからだとmouse_xy.pyが正常に動作するのならば、ターミナル起動までにX serverは起動されています。何らかの操作で起動していますか? それとも自動起動されているのでしょうか?
前者ならばmouse_xy.pyを起動する前にX serverを起動してください。
後者ならばX serverの起動が完了する前にmouse_xy.pyを起動しないでください(.xinitrc内からmouse_xy.pyを起動する等、起動順序を指定してください)
② 「. /etc/X11/Xsession」の行を削除か、コメントアウトしてください。
③ この場合だと.xinitrcが最後までは実行せず、終了しています。

投稿2020/08/25 06:48

編集2020/09/01 05:54
sage

総合スコア1240

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nao99

2020/08/25 08:21

ご回答有難うございます。 起動したいプログラム「mause_xy.py」の中では、X server というものは使用していないです。 また、例えば、~/xinitrc への記述方法について調べてみましたが、具体的な記述例が無く分からないでいます。ここで、起動するプログラムとは、X server を指すのでしょうか?その場合、プログラム名が分かりません。
sage

2020/08/25 08:57

1. "cannot connect to X server"というエラーメッセージから(直接/間接を問わず)X serverを使用していると判断しました。/home/pi/mause_xy.pyの中でX clientを起動しているのではないでしょうか? 2. ~/.xinitrcの中身はとりあえず/home/pi/mause_xy.pyでいいのでは? 起動前に何か環境変数の設定が必要かもしれませんが。
nao99

2020/08/26 01:25

ご回答有難うございます。 以下の通り、「/home/pi/mause_xy.py」を xinitrcファイルに追記し、再起動しましたが、mause_xy.pyは立ち上がりませんでした。 環境変数の設定が必要なのでしょうか。 ''' #!/bin/sh # /etc/X11/xinit/xinitrc # # global xinitrc file, used by all X sessions started by xinit (startx) # invoke global X session script . /etc/X11/Xsession /home/pi/mause_xy.py '''
sage

2020/08/26 04:37

そもそも、X serverを起動していないのでは? X serverが起動されないと~/.xinitrcは起動されません。.xinitrc内からX serverを起動しようするのは無意味です。 mause_xy.pyがX serverを前提とするプログラムを起動しており、そこで失敗しているように見えます。
nao99

2020/08/26 06:11

X serverが起動していないと、~/.xinitrcが起動しないこと理解しました。 ターミナルから、mause_sy.py を起動すると問題なく動作するプログラムですが、自動起動の場合は X serverと言うモノを別途起動する必要があると言うことでしょうか。
sage

2020/08/26 11:53

ターミナルからだとmouse_xy.pyが正常に動作するのならば、ターミナル起動時にはX serverは起動されています。 サービスファイルによる起動の場合(RHEL7/CentOS7以降)、boot処理がシリアルではなく、パラレルで動作します。 (複数のサービスが個々のサービスの初期化の完了を待たずに起動されます。最近のサーバー/PCはマルチコアなのでboot処理時間が短縮されます) サービスファイルに他のサービスとの実行の順序を規定していないとX serverが起動される前にX serverが動作している必要がある(mouse_xy.py[の延長で動作する])X clientが起動されてしまう可能性があり、その場合はX clientはエラー終了します。 サービスファイルにX serverの起動との順序を規定することでも解決すると思いますが、~/.xinitrc や ~/.xsession による起動の場合はX serverが起動されているのが保証されるので、これらによる起動を推奨します。 .xinitrcに記述したのにmause_xy.pyが起動しなかったのは「. /etc/X11/Xsession」を実行すると呼出元プロセスが終了してしまうのが原因のようです。(呼出元プロセスが終了してしまったのでmause_xy.pyが呼び出されない) CentOS7上のbashで「. /etc/X11/xinit/Xsession」を実行するとbashが消えてしまいました。
nao99

2020/09/01 05:36

ご回答有難うございます。 プログラム初心者で中々対処が難しいです。以下、対処はどうしたら良いのでしょうか。 ①mouse_xy.py自動起動時のX server 起動方法 ②.xinitrcに記述したのにmause_xy.pyが起動しなかったのは「. /etc/X11/Xsession」を実行すると呼出元プロセスが終了してしまうのが原因のようです。と言うことですが、原因の呼出元プログラムが終了しない対処方法 ③②の呼出元プログラムとは、何を指すのでしょうか。 間が空いて申し訳ございませんが、ご回答宜しくお願い致します。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問