9

werkzeug を使用して小さな Web サーバーを作成しましたが、通常の python の方法で実行できますpython my_server.py。ページが読み込まれ、すべて正常に動作します。今、私は自分のPCが起動したときにそれを開始したいと考えています。それを行う最も簡単な方法は何ですか?私は成り上がりに苦労してきましたが、実行したstart my_server後すぐに受け取るため、「バックグラウンドで生きている」ようには見えませんkernel: [ 8799.793942] init: my_server main process (7274) terminated with status 1

my_server.py:

...
if __name__ == '__main__':
    from werkzeug.serving import run_simple
    app = create_app()
    run_simple('0.0.0.0', 4000, app)

upstart 構成ファイル my_server.conf:

description "My service"
author  "Some Dude <blah@foo.com>"
start on runlevel [2345]
stop on runlevel [016]
exec /path/to/my_server.py
start on startup

それを機能させる方法はありますか?または、スクリプトをデーモン化する他のより良い方法はありますか?

更新: 問題は にあると思いますmy_server.py。そもそもWebサーバー(メソッド)を開始していないようですrun_simple()。upstart などのタスク ハンドラで .py ファイルを実行するには、どのような手順を実行する必要がありますか?

  • シバンを最初の行として配置する#!/usr/bin/env python
  • 実行権限を許可するchmod 755
  • スーパーユーザー権限でデーモンを起動します (起動を妨げる権限制限がないことを確実にするため)。
  • すべての Python ライブラリがそこにあることを確認してください!
  • 他の何か?

解決済み: この問題は、Python の依存関係の欠落にありました。upstartタスク マネージャー (または など)を介してスクリプトを開始すると、start-stop-daemonエラーはスローされません。pythonpath に必要なものがすべて含まれていることを絶対に確認する必要があります。

4

3 に答える 3

17

gg.kaspersky メソッドに加えて、スクリプトを「サービス」に変換して、以下を使用してスクリプトを開始または停止することもできます。

$ sudo service myserver start
 * Starting system myserver.py Daemon                          [ OK ]
$ sudo service myserver status
 * /path/to/myserver.py is running
$ sudo service myserver stop
 * Stopping system myserver.py Daemon                          [ OK ]

以下を使用して、それをスタートアップ サービスとして定義します。

$ sudo update-rc.d myserver defaults

これを行うには、このファイルを作成して /etc/init.d/ に保存する必要があります。

#!/bin/sh -e

DAEMON="/path/to/myserver.py"
DAEMONUSER="myuser"
DAEMON_NAME="myserver.py"

PATH="/sbin:/bin:/usr/sbin:/usr/bin"

test -x $DAEMON || exit 0

. /lib/lsb/init-functions

d_start () {
        log_daemon_msg "Starting system $DAEMON_NAME Daemon"
        start-stop-daemon --background --name $DAEMON_NAME --start --user $DAEMONUSER --exec $DAEMON
        log_end_msg $?
}

d_stop () {
        log_daemon_msg "Stopping system $DAEMON_NAME Daemon"
        start-stop-daemon --name $DAEMON_NAME --stop --retry 5 --name $DAEMON_NAME
          log_end_msg $?
}

case "$1" in

        start|stop)
                d_${1}
                ;;

        restart|reload|force-reload)
                        d_stop
                        d_start
                ;;

        force-stop)
               d_stop
                killall -q $DAEMON_NAME || true
                sleep 2
                killall -q -9 $DAEMON_NAME || true
                ;;

        status)
                status_of_proc "$DAEMON_NAME" "$DAEMON" "system-wide $DAEMON_NAME" && exit 0 || exit $?
                ;;
        *)
                echo "Usage: /etc/init.d/$DAEMON_NAME {start|stop|force-stop|restart|reload|force-reload|status}"
                exit 1
                ;;
esac
exit 0

この例では、直接実行できるように、Python ファイルの先頭に #!/usr/bin/python のようなシバンがあると想定しています。

最後になりましたが、Python サーバーとサービス スクリプトに実行権限を付与することを忘れないでください。

$ sudo chmod 755 /etc/init.d/myserver
$ sudo chmod 755 /path/to/mserver.py

これは、私が最初にこれを学んだページです(フランス語)。

乾杯。

于 2012-12-05T10:21:46.680 に答える
11

簡単な方法の 1 つは、crontab を使用することです。

$ crontab -e

編集用の crontab ファイルが表示されるので、最後に次の行を書き込みます。

@reboot python myserver.py

そしてやめます。これで、再起動するたびに、cron デーモンが myserver python スクリプトを実行します。

于 2012-12-05T09:49:40.550 に答える
4

ブート時に開始するスーパーバイザーサービスがある場合、スーパーバイザー サービスの記述ははるかに簡単です。

プログラムが失敗した場合に自動再起動を設定することもできます。

于 2012-12-05T10:46:47.473 に答える