2016-05-18 7 views
2

私はsystemdを使用するとgolang Webアプリケーションを起動できませんが、手動で起動すると正常に動作します。私のシステム構成の問題は何ですか? env GOOS=linux GOARCH=amd64 go build -v bitbucket.org/myapp/backendなぜsystemdがgolang Webアプリケーションを起動できないのですか

にsystemdサービスのステータス

$ sudo service goweb status 
Redirecting to /bin/systemctl status goweb.service 
● goweb.service - Backend service 
    Loaded: loaded (/usr/lib/systemd/system/goweb.service; disabled; vendor preset: disabled) 
    Active: inactive (dead) 

May 18 10:55:56 instance-1 systemd[1]: Started Backend service. 
May 18 10:55:56 instance-1 systemd[1]: Starting Backend service... 

P/S:それLO

$ cat goweb.service 
[Unit] 
Description=Backend service 
After=network.target 

[Service] 
User=myapp 
Group=myapp 
Restart=on-failure 
ExecStart=/u01/backend 

[Install] 
WantedBy=multi-user.target 

backend

goweb.serviceはコマンドでコンパイルされたバイナリファイルです。私のWebアプリのようなオークは始まったが、すぐに停止した。

設定Type=forkingを試してみると、サービスの状態が以下のように表示されます。ログStarted Backend service.Starting Backend service...の順序が逆になった理由を説明できますか?

$ sudo service goweb status 
Redirecting to /bin/systemctl status goweb.service 
● goweb.service - Backend service 
    Loaded: loaded (/usr/lib/systemd/system/goweb.service; enabled; vendor preset: disabled) 
    Active: inactive (dead) since Wed 2016-05-18 11:06:02 UTC; 2s ago 
    Process: 25847 ExecStart=/u01/backend (code=exited, status=0/SUCCESS) 

May 18 11:06:02 instance-1 systemd[1]: Starting Backend service... 
May 18 11:06:02 instance-1 systemd[1]: Started Backend service. 

結果、私は(端末から)手動でWebアプリケーションを実行します。

$ /u01/backend 
[GIN-debug] [WARNING] Running in "debug" mode. Switch to "release" mode in production. 
- using env: export GIN_MODE=release 
- using code: gin.SetMode(gin.ReleaseMode) 

[GIN-debug] POST /upload     --> main.uploadFileHandler (3 handlers) 
[GIN-debug] Environment variable PORT="9005" 
[GIN-debug] Listening and serving HTTP on :9005 

更新

  1. 私はsupervisordを試してみて、それがうまく(同じバイナリファイルを動作します)
  2. systemd、サービスの設定をRestart=alwaysRestartSec=15に変更しました。 systemdは私のWebアプリケーションを再開し続けます。

supervisordはうまく動作しますが、systemdはなぜですか。私はsystemdがそのような基本的な仕事でうまくいくと思います!

+0

あなたのWebアプリケーションはブロックされていません。あなたのbinarieは動作しますか? – CESCO

+0

Webアプリケーションを手動で起動するとブロックされています。 SSHを閉じると、いつでも停止します。だから私はsystemdを使ってバックグラウンドでアプリを動かすのです。手動で実行すると情報が更新されました。 – drakid

答えて

5

私は野生の刺し傷をとって、あなたのアプリケーションがポート80および/または443で聞いてくれると推測します。そのためには、setcapを使ってその許可を与えることをお勧めします。

例:sudo setcap 'cap_net_bind_service=+ep' /u01/backendこれは、アプリケーションをコンパイルするたびに実行する必要があります。

+0

私のウェブアプリケーションはポート9005で聴いています.Btw、私はあなたの提案を試みましたが、うまくいきません。 – drakid

+0

@drakid私はginとsystemdを使っていくつかのWebアプリケーションを持っているので、あなたのアプリがクラッシュしていると思うので、 'journalctl -u goweb'をチェックしてstderrにログを残してください。 – OneOfOne

0

一時的に環境をダンプする最小限のバージョンにアプリケーションを置き換えます。手動で実行する環境はsystemdと十分に似ていますか?

3

私はこれが古いと知っていますが、十分な回答がないことを知っていましたので、投稿すると思いました。私のアプリも手動で実行されていましたが、systemdを使用するとうまく動作しませんでした。手動でアプリを実行している場合、テンプレートフォルダは私のメインの相対あった

tpl = template.Must(template.ParseGlob("templates/*")) 

:私は、次のような、それは囲碁プログラム状態であろうとファイルパスとしなければならなかったが実現しました。

tpl = template.Must(template.ParseGlob("./home/ubuntu/templates/*")) 

今にsystemd作品:のような、ファイルを行くが、systemdには、それを実行するだろうというとき、ファイルパスが異なっていた(まだこれを解決するために、なぜか方法がわからない)、今の私は絶対ファイルパスをハードコーディング。

これが役に立ちます。もし誰かがより良い解決策を生み出す方法を精緻化することができれば、私を完全に助けるでしょう!

+1

systemdサービスファイルの '[service]'の下に 'WorkingDirectory =/home/ubuntu /'を挿入してください –

関連する問題