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

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

ただいまの
回答率

87.36%

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

受付中

回答 1

投稿 編集

  • 評価
  • クリップ 2
  • VIEW 2,570

score 10

【実現したいこと】
ラズパイ起動時に、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


で修正を行った。

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

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

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • yasutakatou

    2020/10/15 14: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 16:22

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

    キャンセル

  • yasutakatou

    2020/10/15 16:58

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

    キャンセル

回答 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/26 15:11

    X serverが起動していないと、~/.xinitrcが起動しないこと理解しました。

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

    キャンセル

  • 2020/08/26 20: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が消えてしまいました。

    キャンセル

  • 2020/09/01 14:36

    ご回答有難うございます。
    プログラム初心者で中々対処が難しいです。以下、対処はどうしたら良いのでしょうか。

    ①mouse_xy.py自動起動時のX server 起動方法

    ②.xinitrcに記述したのにmause_xy.pyが起動しなかったのは「. /etc/X11/Xsession」を実行すると呼出元プロセスが終了してしまうのが原因のようです。と言うことですが、原因の呼出元プログラムが終了しない対処方法

    ③②の呼出元プログラムとは、何を指すのでしょうか。

    間が空いて申し訳ございませんが、ご回答宜しくお願い致します。

    キャンセル

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

  • ただいまの回答率 87.36%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る