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

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

ただいまの
回答率

90.00%

ubuntuでデーモンの登録・実行方法がわかりません。

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 1,870

UekiKouji

score 115

ある記事を元に自作で作ったWebサーバをubuntu16のデーモンに登録して、実行させようとするのですが、うまく動作しないためご教授をお願いします。

参考にしたのは、以下のサイトです。

http://denbei.o.oo7.jp/f1/?p=2114

【うまく行かないこと】
登録したサービスを実行し、statusを見ると、サービスの実行に失敗しているようでした。そこで、/var/log/syslogでログを見ると、/home/web/cgiserver.pyのファイルを実行しようとして、権限がないと怒られているようです。
実行権限がないので、とりあえず上記のファイルをchmod 777 /home/web/cgiserver.pyで実行権限をあ与えて見ましたが、同じエラーになりうまくいきません。何が悪いのか思いつかないので、教えてくださいお願いします。

以下がエラー内容です。

Jul 16 15:50:36 ubuntu1607 systemd[53788]: cgid.service: Failed at step EXEC spawning /home/web/cgiserver.py: Permission denied
Jul 16 15:50:36 ubuntu1607 systemd[1]: cgid.service: Main process exited, code=exited, status=203/EXEC
Jul 16 15:50:36 ubuntu1607 systemd[1]: cgid.service: Unit entered failed state.
Jul 16 15:50:36 ubuntu1607 systemd[1]: cgid.service: Failed with result 'exit-code'.
Jul 16 15:50:36 ubuntu1607 systemd[1]: cgid.service: Service hold-off time over, scheduling restart.
Jul 16 15:50:36 ubuntu1607 systemd[1]: Stopped CGI-Server.
Jul 16 15:50:36 ubuntu1607 systemd[1]: cgid.service: Start request repeated too quickly.
Jul 16 15:50:36 ubuntu1607 systemd[1]: Failed to start CGI-Server.
Jul 16 15:50:36 ubuntu1607 systemd[1]: cgid.service: Unit entered failed state.
Jul 16 15:50:36 ubuntu1607 systemd[1]: cgid.service: Failed with result 'start-limit-hit'.

ソースについて追加します。
cgiserver.pyの!/home/web/envは、python3の仮想環境のパスです。
よろしくお願いします。
// cgiserver.py

#!/home/web/env python3
# -*- coding: utf-8 -*-

from http.server import HTTPServer, CGIHTTPRequestHandler
import os
os.chdir('/home/web')
host = '192.168.0.14'
port = 8000
httpd = HTTPServer((host, port), CGIHTTPRequestHandler)
print('serving at port', port)
httpd.serve_forever()


// /etc/systemd/system/cgid.service

[Unit]
Description = CGI-Server
[Service]
ExecStart=/home/web/cgiserver.py
Restart=always
Type=simple
[Install]
WantedBy=multi-user.target
  • 気になる質問をクリップする

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

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

  • 退会済みユーザー

    退会済みユーザー

    2017/07/16 19:06

    ソースコードのほう、追記お願いします。おそらく、pythonを使わずpyファイル自体を実行しようとしているので、先頭にパス記述が必要なはずです。

    キャンセル

  • TaichiYanagiya

    2017/07/17 17:16

    シェバンが /home/web/env となっていますが、実行ファイルなのですか? 実行権限はついていますか? /home/web/env ファイルはどのような内容ですか?

    キャンセル

  • UekiKouji

    2017/07/17 19:24

    python3 -m venv envで作成したvenvです。

    キャンセル

  • UekiKouji

    2017/07/17 19:25

    venv環境で実行しようと考えています。

    キャンセル

回答 1

checkベストアンサー

0

python3 -m venv envで作成したvenvです。

/home/web/env は実行ファイルではなく、ディレクトリになっていると思います。
ですので、シェバン(ファイル先頭の「#!」で始まる行)に指定するものではありません。
cgiserver.py のシェバンは、参考 URL にあるとおり #!/usr/bin/env python3 とします。

あとは、venv 環境下で cgiserver.py を実行するようにすればいいと思います。

方法1: EnvironmentFile= で環境変数を設定

/etc/systemd/system/cgid.service ファイルに以下のように EnvironmentFile= 行を追加して、venv の環境変数を設定します。

[Unit]
Description = CGI-Server
[Service]
EnvironmentFile=/home/web/env/bin/activate
ExecStart=/home/web/cgiserver.py
Restart=always
Type=simple
[Install]
WantedBy=multi-user.target


修正後、systemctl daemon-reload で反映させます。

方法2: シェルスクリプトのラッパーを作成

以下のようなシェルスクリプトを作成し、環境変数を設定した後、cgiserver.py を実行するようにします。

/home/web/cgiserver.sh

#!/bin/bash
source /home/web/env/bin/activate
exec /home/web/cgiserver.py

/etc/systemd/system/cgid.service ファイルで、このシェルスクリプトを実行するようにします。

[Unit]
Description = CGI-Server
[Service]
ExecStart=/home/web/cgiserver.sh
Restart=always
Type=simple
[Install]
WantedBy=multi-user.target

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/07/18 00:35

    ありがとうございます。試してみます。

    キャンセル

  • 2017/07/19 07:38

    ご親切にありがとうございます。動きました。

    キャンセル

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

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