🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Hubot

HubotはGitHub社が開発したチャットbotのフレームワークです。

Raspberry Pi

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

Slack

Slackは、Tiny Speckという企業からリリースされたコミュニケーションツールです。GoogleDriveやGitHubなど、さまざまな外部サービスと連携することができます。

Q&A

1回答

1747閲覧

RapberryPiでHubotをデーモン化する

MasatoN

総合スコア0

Hubot

HubotはGitHub社が開発したチャットbotのフレームワークです。

Raspberry Pi

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

Slack

Slackは、Tiny Speckという企業からリリースされたコミュニケーションツールです。GoogleDriveやGitHubなど、さまざまな外部サービスと連携することができます。

0グッド

0クリップ

投稿2021/02/10 03:23

編集2021/02/18 05:09

前提・実現したいこと

以下のサイトを参考にして、RapberryPiでHubotをSlackに繋げそれをデーモン化するコードを書いています。

Raspberry PiにhubotをインストールしてSlackから呼び出すまでの手順

HubotとSlackを繋げるまではできたのですが、デーモン化するところが上手くいきません。
RaspberryPiに関しては完全に初心者でエラー原因が分からないので、解決方法を教えていただきたいです。

発生している問題・エラーメッセージ

systemdに作成した設定ファイルpibot.serviceの動作確認をすると以下のようなエラーが出てしまいました。

pi@raspberrypi:/etc/systemd/system $ systemctl status pibot ● pibot.service - pibot service Loaded: loaded (/etc/systemd/system/pibot.service; enabled; vendor preset: enabled) Active: failed (Result: exit-code) since Wed 2021-02-10 10:38:17 JST; 31min ago Main PID: 2276 (code=exited, status=203/EXEC) 2月 10 10:38:17 raspberrypi systemd[1]: pibot.service: Service RestartSec=100ms expired, scheduling restart. 2月 10 10:38:17 raspberrypi systemd[1]: pibot.service: Scheduled restart job, restart counter is at 5. 2月 10 10:38:17 raspberrypi systemd[1]: Stopped pibot service. 2月 10 10:38:17 raspberrypi systemd[1]: pibot.service: Start request repeated too quickly. 2月 10 10:38:17 raspberrypi systemd[1]: pibot.service: Failed with result 'exit-code'. 2月 10 10:38:17 raspberrypi systemd[1]: Failed to start pibot service.

pibot.service

[Unit] Description=pibot service [Service] ExecStart=/home/pi/hubot/pibot/bin/run_hubot.sh Restart=always Type=simple [Install] WantedBy=multi-user.target

エラーコードが出た経緯

1. Hubotの設定
まず、RaspberryPiの/home/pi/hubot/pibotディレクトリを作り、そこでyo hubotを実行しhubotの作成を行いました。

$cd ~/hubot/pibot $yo hubot

その後、Hubotの設定を以下のように行いました。

Owner:自分のメールアドレス
Bot name:pibot
Description:適当な値
Bot adapter:slack

設定した後に$bin/hubotpibot pingを実行すると、HUBOTからPONGと返ってきたのが確認できました。

2.SlackとHubotを繋げる
次にSlackにHubotを追加したのち、APIトークンをコピーしました。
イメージ説明
その後、~/hubot/pibotディレクトリの中で、hubotの設定ファイルを開きました。

$cd ~/hubot/pibot $nano bin/hubot

上のコマンドをターミナルに打つと下のようなテキストエディタが開かれたので、取得したAPIトークンをペーストしました。

#!/bin/sh set -e npm install export HUBOT_SLACK_TOKEN=(取得したSlackのAPIトークン) export PATH="node_modules/.bin:node_modules/hubot/node_modules/.bin:$PATH" exec node_modules/.bin/hubot --name "pibot" "$@"

ターミナルに戻り、$bin/hubot -a slackを実行してみると、Slack上でHubotが反応しているのが確認できました。
3.Hubotのデーモン化
まず、bin/hubotと同じディレクトリにrun_hubot.shというシェルスクリプトを作成しました。

$cd /home/pi/hubot/pibot/bin $sudo nano run_hubot.sh

run_hubot.sh

#!/bin/sh cd /home/pi/hubot/pibot sudo -u pi bin/hubot --adapter slack

その後、systemd/systemフォルダに移動しサービス起動用の設定ファイルpibot.serviceを追加しました。

$cd /etc/systemd/system $sudo nano pibot.service

pibot.service

[Unit] Description=pibot service [Service] ExecStart=/home/pi/hubot/pibot/bin/run_hubot.sh Restart=always Type=simple [Install] WantedBy=multi-user.target

その後、pibot.serviceが正しく実行できているかどうかを確認するために、ターミナルで以下のコマンドを実行しましたが、上述のようなエラーが出てしまいました。

$sudo systemctl daemon-reload $systemctl status pibot
pi@raspberrypi:/etc/systemd/system $ systemctl status pibot ● pibot.service - pibot service Loaded: loaded (/etc/systemd/system/pibot.service; enabled; vendor preset: enabled) Active: failed (Result: exit-code) since Wed 2021-02-10 10:38:17 JST; 31min ago Main PID: 2276 (code=exited, status=203/EXEC) 2月 10 10:38:17 raspberrypi systemd[1]: pibot.service: Service RestartSec=100ms expired, scheduling restart. 2月 10 10:38:17 raspberrypi systemd[1]: pibot.service: Scheduled restart job, restart counter is at 5. 2月 10 10:38:17 raspberrypi systemd[1]: Stopped pibot service. 2月 10 10:38:17 raspberrypi systemd[1]: pibot.service: Start request repeated too quickly. 2月 10 10:38:17 raspberrypi systemd[1]: pibot.service: Failed with result 'exit-code'. 2月 10 10:38:17 raspberrypi systemd[1]: Failed to start pibot service.

試したこと

1.pibot.serviceのRestartの変更
https://teratail.com/questions/242215
上のリンクにRestart=always にするとデーモン化に失敗してしまうと書いてあったので、代わりに以下のコードを試してみましたが、同様のエラーが生まれました。

/etc/systemd/system/pibot.service

[Unit] Description=pibot service [Service] ExecStart=/home/pi/hubot/pibot/bin/run_hubot.sh Restart = on-failure RestartSec=10s [Install] WantedBy=multi-user.target

2.run_hubot.shの実行確認
run_hubot.shが正しくない可能性を確認するために、ターミナルでシェルスクリプトの実行を行いました。

$cd ~/hubot/pibot/bin $. run_hubot.sh

上のコマンドの結果として、Slack上でHubotが起動したのを確認できたので、問題はpibot.service側にあるのではないかと考えています。ただ、その解決策はまだ見つかりません。

3.run_hubot.shの編集
アドバイスを受けて、run_hubot.shにexit 0を追記してみましたが、同様のエラーが出てしまいました。
/home/pi/hubot/pibot/bin/run_hubot.sh

#!/bin/sh cd /home/pi/hubot/pibot sudo -u pi bin/hubot --adapter slack exit 0
$cd /etc/systemd/system $sudo systemctl daemon-reload $sudo systemctl start pibot.service $systemctl status pibot ● pibot.service - pibot service Loaded: loaded (/etc/systemd/system/pibot.service; enabled; vendor preset: en Active: failed (Result: exit-code) since Thu 2021-02-18 14:02:25 JST; 18s ago Process: 1533 ExecStart=/home/pi/hubot/pibot/bin/run_hubot.sh (code=exited, st Main PID: 1533 (code=exited, status=203/EXEC) 2月 18 14:02:25 raspberrypi systemd[1]: pibot.service: Failed with result 'exit 2月 18 14:02:25 raspberrypi systemd[1]: pibot.service: Service RestartSec=100ms 2月 18 14:02:25 raspberrypi systemd[1]: pibot.service: Scheduled restart job, r 2月 18 14:02:25 raspberrypi systemd[1]: Stopped pibot service. 2月 18 14:02:25 raspberrypi systemd[1]: pibot.service: Start request repeated t 2月 18 14:02:25 raspberrypi systemd[1]: pibot.service: Failed with result 'exit 2月 18 14:02:25 raspberrypi systemd[1]: Failed to start pibot service.

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

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

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

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

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

guest

回答1

0

hubotを動かすためのpibot.serviceを作ったのでしょうか?

#!/bin/sh cd /home/pi/hubot/pibot sudo -u pi bin/hubot --adapter slack

これがrun_hubot.shですか?

シェルスクリプト内から何か実行する場合は絶対パスじゃないとダメだった気がします。
絶対パスに変えてみてください。

また、sudoを書く理由がよくわかりません。(どうなってほしいの???)
.serviceにUserとGroupを記載すればそれで実行してくれます。
systemdの.serviceファイルから、サービス実行ユーザーを変更する

以下のshと思われるものは何のためにあるのか不明なため触れていません。
serviceから毎回実行する予定なら、exportやnpm installが毎回必要と思えないので、何か間違っていると思います。

#!/bin/sh set -e npm install export HUBOT_SLACK_TOKEN=xoxb-1687056892356-1693521603667-3StDqEPhf3r2aiYNw1F8Nx1q export PATH="node_modules/.bin:node_modules/hubot/node_modules/.bin:$PATH" exec node_modules/.bin/hubot --name "pibot" "$@"

teratailの「codeの挿入」にはファイル名を表示する機能がありません。
単にコードを整形して表示したいのではなく、ファイルとして実行してというような場合はファイル名も記載してくれないと意味がわかりません。
(#!/bin/shが一番上にあったらファイルとして保存されているものだと考えますが、コマンドとして実行しただけのようにも見えるのでよくわかりませんでした)

投稿2021/02/10 07:02

FiroProchainezo

総合スコア2421

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

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

MasatoN

2021/02/10 11:04

回答ありがとうございます!teratailを利用するのが初めてで、必要な情報が所々抜けてしまい申し訳ないです....ファイル名は #!/bin/sh  set -e … → ~/hubot/pibot/bin/hubot (↑はcd ~/hubot/pibot nano bin/hubot で開いたhubotの設定ファイルです.) #!/bin/sh cd /home/pi/hubot/pibot … → ~/hubot/pibot/bin/run_hubot.sh [Unit] Description=pibot service … → ~/etc/systemd/system/pibot.service のようになっています。~/hubot/pibot/bin/hubotではSlackで取得したAPIトークンを記載しました。 Linuxを構ったのも数回だけで右も左も分からないので、今回はリンク先のコードをそのまま流用しました。 https://qiita.com/s_harada/items/c10b1322daec5521b261 そのため、run_hubot.shでsudoを使用している理由も正直よくわかっていないです。至らない部分が多くて恐縮です...... ご指摘いただいた通りに、run_hubot.sh内のパスを絶対パスにして #!/bin/sh -u pi /home/pi/hubot/pibot/bin/hubot --adapter slack に変更してみましたが、同様のエラーが出てしまいました。厚かましいかもしれませんが、課題点教えていただけると幸いです。
FiroProchainezo

2021/02/11 08:54

追記は質問文を編集してお願いします。 コメント欄に書かれても修飾が何も効かず分かりづらいです。
MasatoN

2021/02/12 07:57

了解しました。すぐに編集します。
FiroProchainezo

2021/02/15 08:02

sudo systemctl start pibot.serviceは実行しましたか? また、run_hubot.sh の一番下に`exit 0` を追加してからsudo systemctl daemon-reloadして、sudo systemctl start(stop -> start) pibot.serviceしたらどうなりますか?
MasatoN

2021/02/16 07:26

返信ありがとうございます! sudo systemctl pibot.serviceは以前してみましたが、同様のエラーが出てしまいました。 'exit 0'を追記する方法は初めて知ったので今回試してみましたが、うまくいかなかったです。
FiroProchainezo

2021/02/16 08:05

単に /home/pi/hubot/pibot/bin/hubot --adapter slack を実行した場合は実行可能ですか?
MasatoN

2021/02/18 04:59 編集

試しに実行してみると、以下のようなエラー文が出てきました。(本当に何度も申し訳ないです....) ~ $ /home/pi/hubot/pibot/bin/hubot --adapter slack npm WARN saveError ENOENT: no such file or directory, open '/home/pi/package.json' npm WARN enoent ENOENT: no such file or directory, open '/home/pi/package.json' npm WARN pi No description npm WARN pi No repository field. npm WARN pi No README data npm WARN pi No license field. up to date in 1.296s found 0 vulnerabilities /home/pi/hubot/pibot/bin/hubot: 10: exec: node_modules/.bin/hubot: not found
FiroProchainezo

2021/02/19 02:18

node_modules/.bin/hubotっていうのはどこにあるか分かりますか?
MasatoN

2021/02/20 12:39

長い期間返信していただき、ありがとうございます!探してみたら、ディレクトリは~/hubot/pibot/node_modules/.bin/hubotとなっていました。ただ、エラーの意味はよく分かってないです...
FiroProchainezo

2021/02/22 07:40

/etc/systemd/system/pibot.service で、WorkingDirectoryに`/home/pi/hubot/pibot/`(ユーザはpiですよね?piじゃなければユーザに合わせて指定してください。)を指定して実行してみてください。 WorkingDirectoryの指定例:https://qiita.com/tabimoba/items/e0230eb9d1f943b8708f pibot.serviceを更新 -> sudo systemctl daemon-reload -> sudo systemctl start pibot.service(すでに実行中の場合はrestart or stop -> start) なお、パスを求められた時はフルパス(~/は使わずに/home/pi/とか)を教えてください。 ~/はユーザのカレントディレクトリで、回答者は誰でログインしているかとか、そもそもユーザはどんなのが登録されているかとかがわかりません。
MasatoN

2021/02/26 12:25

すみません、気づくのが後になり返信遅れてしまいました。 早速指摘されたように/etc/systemd/system/pibot.service を下記のように変更してみたのちに [Unit] Description=pibot service [Service] WorkingDirectory=/home/pi/hubot/pibot/ ExecStart=/home/pi/hubot/pibot/bin/run_hubot.sh Restart=always Type=simple [Install] WantedBy=multi-user.target ターミナルで下のようにコマンドを打ちましたが、 $sudo daemon-reload $sudo systemctl restart pibot.service $sudo systemctl status pibo.service 下のようなエラーが出てしまいました(よく分かっていないのですが、エラー内容は少し違うみたいです) Loaded: loaded (/etc/systemd/system/pibot.service; enabled; vendor preset: enabled) Active: failed (Result: exit-code) since Fri 2021-02-26 21:14:26 JST; 34s ago Process: 1224 ExecStart=/home/pi/hubot/pibot/bin/run_hubot.sh (code=exited, status=203/EXEC) Main PID: 1224 (code=exited, status=203/EXEC) 2月 26 21:14:26 raspberrypi systemd[1]: pibot.service: Service RestartSec=100ms expired, scheduling restart. 2月 26 21:14:26 raspberrypi systemd[1]: pibot.service: Scheduled restart job, restart counter is at 5. 2月 26 21:14:26 raspberrypi systemd[1]: Stopped pibot service. 2月 26 21:14:26 raspberrypi systemd[1]: pibot.service: Start request repeated too quickly. 2月 26 21:14:26 raspberrypi systemd[1]: pibot.service: Failed with result 'exit-code'. 2月 26 21:14:26 raspberrypi systemd[1]: Failed to start pibot service.
FiroProchainezo

2021/03/01 00:43

手元にRaspberryPiがないのでちょっとわからないですね。 申し訳ございませんが、参考にしているQiitaを参考に、最初からやり直してみてはいかがでしょうか。 いくらか経験がある状態で最初からやり直すと、2回目はすんなり動いたりしますので。
MasatoN

2021/03/02 05:34

了解しました!もう一度自分でプログラムを確かめてみます。 長い間、指導していただき本当にありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問