Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

pm2によるPC起動時の実行において、他のPCからアクセスできない #60

Closed
tkmsst opened this issue May 14, 2019 · 18 comments

Comments

@tkmsst
Copy link

tkmsst commented May 14, 2019

Environment

  • Version of Mirakurun: 2.11.0
  • Version of Node: v10.15.3
  • Version of NPM: 6.9.0
  • Platform: Linux Debian Stretch
  • Status of Mirakurun: https://gist.github.com/... (from http://mirakurun-server-ip:40772/api/status)

Issue

...
設定(.yml)ファイルを適切なフォルダに入れ
sudo npm install mirakurun -g --unsafe-perm --production
にてインストールを行った直後は、同じLANの他のPCからBonDriver_Mirakurunや
http://mirakurun-server-ip:40772/api/statusでアクセスできるが、
一旦再起動すると、他のPCからアクセスできなくなります。
なお、この状態でも「pm2 list」で正常に起動しているのが確認できますし、
実際に「ps aux」で「Mirakurun: Server」のプロセスも確認できます。

ここで「pm2 restart mirakurun-server」を行うと再びアクセスできるようになります。

なお、古いバージョン(2.9.0)では問題ありませんでした。

@kanreisa
Copy link
Member

大変お手数ですが下記の対応をしていただけると助かります。

# 再現させた状態で
sudo -i
pm2 -v
pm2 status

netstat -ap | grep Mirakurun
netstat -ap | grep 40772

@tkmsst
Copy link
Author

tkmsst commented May 15, 2019

ご返答ありがとうございます。アップしました。
https://gist.github.com/epgdatacapbon/03fb296741c2bc00dd6bdfc6bca926cd
なお、この状態ではBonDriver_Mirakurunで初期化ができないエラーで視聴できませんが、
#pm2 restart mirakurun-server
で正常に動作するようになります。

ただ、古いバージョンを入れなしたところ、最初は再起動してもうまく行きましたが、
何回か繰り返しているうちに古いバージョンでもエラーが出るようになったため
こちらの環境の問題がありそうです。

@kanreisa
Copy link
Member

ログを見る限り NIC に割り当てられている IP アドレスで LISTEN されていないようです。
2.11.0 で起動時間が短縮したことによる影響かもしれません。
NIC が有効になる前に起動してしまっている気がします。

一旦 PM2 のサービスを再登録してみてください

sudo -i
pm2 unstartup
sudo reboot # ここで一旦再起動して pm2 がスタートアップしないことを確認する
#
sudo -i
pm2 startup

適当に pm2 の起動を遅らせるか、NIC の初期化が遅延しないようにすると解決すると思います

@tkmsst
Copy link
Author

tkmsst commented May 15, 2019

早速のご返答ありがとうございます。
一旦 PM2 のサービスを再登録しても解決しなかったため、
/etc/systemd/system/pm2-root.service
について

[Service]
ExecStartPre=/bin/sleep 5

を追加してpm2の起動を遅らせることにより対応できました。
ありがとうございました。

@akimasa
Copy link
Contributor

akimasa commented May 15, 2019

横から失礼します。
下記のコマンドを実行するといかがでしょうか?
sudo pm2 startup --wait-ip

PM2 2.9.0以降ではネットワークが起動するのを待ってから開始するオプションがあるみたいです

@kanreisa
Copy link
Member

すばら C

@tkmsst
Copy link
Author

tkmsst commented May 16, 2019

pm2 Ver. 3.5.0で

sudo pm2 startup --wait-ip

sudo pm2 startup systemd --wait-ip

を試しましたが、うまくいきませんでした。

@yamakenjp
Copy link

yamakenjp commented May 16, 2019

横からですが、

Platform: Linux Debian Stretch

とのことなので、systemdから pm2が動いてるかと思います。

/etc/systemd/system/pm2-root.service について

After=network.target
WantedBy=multi-user.target

になってますかね。
普通networkが立ち上がってからpm2が起動するはずですが、これでダメの場合、
systemd-networkd-wait-online
http://www.freedesktop.org/wiki/Software/systemd/NetworkTarget/

を有効にすれば解決できそうです。

sudo systemctl enable systemd-networkd (おそらくすでに有効のはず)
sudo systemctl enable systemd-networkd-wait-online

を実行し

/etc/systemd/system/pm2-root.service

After=network-online.target
WantedBy=network-online.target

に書き換えればnetwork起動後にpm2を起動できるかと。

@tkmsst
Copy link
Author

tkmsst commented May 16, 2019

yamaken-sapporoさんありがとうございます。
解決致しました!

"pm2 startup --wait-ip"後のpm2-root.serviceは下記のようになっていました。

[Unit]
Description=PM2 process manager
Documentation=https://pm2.keymetrics.io/
After=network.target network-online.target
Wants=network-online.target
Restart=on-failure

[Service]
Type=forking
User=root
LimitNOFILE=infinity
LimitNPROC=infinity
LimitCORE=infinity
Environment=PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/$
Environment=PM2_HOME=/root/.pm2
PIDFile=/root/.pm2/pm2.pid

ExecStart=/usr/lib/node_modules/pm2/bin/pm2 resurrect
ExecReload=/usr/lib/node_modules/pm2/bin/pm2 reload all
ExecStop=/usr/lib/node_modules/pm2/bin/pm2 kill

[Install]
WantedBy=multi-user.target network-online.target

これを、ご指摘の通り

After=network-online.target
WantedBy=network-online.target

とすることによりうまくいきました。
ありがとうございます。

@yamakenjp
Copy link

[Unit]
Description=PM2 process manager
Documentation=https://pm2.keymetrics.io/
After=network.target network-online.target
Wants=network-online.target
Restart=on-failure

うーん、AfterとWantsで network-online.target が謎というか意味がないですね。
Wantsの方が不要かと思います。
ちなみにAfterとWantsの違いですがWantsは指定されているものが起動失敗しても
この場合においてだとpm2は起動してしまうので、切り分けができない気が。

ちなみにデフォルトテンプレートは下記のはずなのですが、色々変更しましたか?

https://github.com/Unitech/pm2/blob/master/lib/templates/init-scripts/systemd.tpl

@akimasa
Copy link
Contributor

akimasa commented May 16, 2019

sudo pm2 startup --wait-ipを実行してもらっているので、下のテンプレートが使われていると思います。
https://github.com/Unitech/pm2/blob/master/lib/templates/init-scripts/systemd-online.tpl
AfterとWantsでnetwork-online.targetが指定されています。
PM2側の修正が必要でしょうかね?

@tkmsst
Copy link
Author

tkmsst commented May 16, 2019

オリジナルだとうまくいかないのがことの発端なので

pm2 startup --wait-ip

を実行した結果、下記のテンプレートを使うようになっているようです。
https://github.com/Unitech/pm2/blob/master/lib/templates/init-scripts/systemd-online.tpl

やはりおかしいと思うので、pull request書きました。
Unitech/pm2#4285

@yamakenjp
Copy link

sudo pm2 startup --wait-ip を実行してもらっているので、下のテンプレートが使われていると思います。

あ、そいえばこの前提を忘れてました。
とりあえず、動いてよかった!
pm2にmargeされればみんな幸せ!

@akimasa
Copy link
Contributor

akimasa commented May 17, 2019

pm2の修正なしで何とかする方法があるのではないかと思い、試していましたが、勘違いかもしれないので何でもないです。
すみません。

@akimasa
Copy link
Contributor

akimasa commented May 17, 2019

Debian Stretchを入れてみて気が付いたのですが、Debianはsystemd-networkdを使っていないみたいです。

なのでsystemd-networkd-wait-onlineの意味がなかったです…

After=network-online.target
WantedBy=network-online.target

Debian Stretchでpm2-root.serviceに上記の修正を加えてみましたが、LANが接続されていない状態で起動してしばらく経ってからLANに接続すると、MirakurunがLANのIPアドレスでLISTENしませんでした。
systemd-networkdを採用しているArch Linuxでは上記の修正なしでsudo pm2 startup --wait-ipを実行して、シャットダウン。LANが接続されていない状態で起動してしばらく経ってからLANに接続すると、LANに接続されるのを待ってからpm2が起動して、LANでLISTENしていました。

したがって、 Unitech/pm2#4285 の修正を行っても、うまくいかない場合がある気がします。修正なしでも環境によってはIPアドレス取得の遅延が起きても問題ない場合もあります。

Debian Stretchのネットワーク周りが怪しい気がします。ググったら、Debianでnetwork-online.targetがうまく動いていないとの質問がありました。自分が確認した限りではArchもRaspbianもIPアドレスが取得されるまでnetwork-online.targetに達することは無かったですが、DebianだけはIPアドレスが取得されていない状態ですぐにnetwork-online.targetに達してしまうようです。

Debianにsystemd-networkdが来れば簡単に解決できそうですが、それ以外に何かうまい方法はありませんかね?

@tkmsst
Copy link
Author

tkmsst commented Jun 9, 2019

クリーンインストールして再度試してみました。
akimasaさんのおっしゃる通りパッチだけではダメで、下記のコマンドを実行する必要がありました。

sudo systemctl enable systemd-networkd
sudo systemctl enable systemd-networkd-wait-online

@akimasa
Copy link
Contributor

akimasa commented Jul 1, 2019

返事が遅くなってすみません。

先ほど、こちらの環境でも試してみました。
クリーンインストールをした上で、epgdatacapbonさんの挙げてくれたコマンドを実行したところ、正常にアクセスすることができました!
PM2のパッチは無しで大丈夫でした。

Mirakurunのインストール後、下記のコマンドだけを実行すれば大丈夫そうです。

pm2 startup systemd --wait-ip
systemctl enable systemd-networkd
systemctl enable systemd-networkd-wait-online

kanreisa added a commit that referenced this issue Nov 5, 2019
@kanreisa
Copy link
Member

kanreisa commented Nov 5, 2019

@2.12.0 で挙動を改善してみました。皆様フィードバックありがとうございました。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

4 participants