Python スクリプトをバックグラウンドで実行するいくつかの方法

PHP中文网
リリース: 2017-04-01 15:15:29
オリジナル
3252 人が閲覧しました

python で書かれた監視スクリプト test1.py は、while True モードで実行されます。SSH リモート時 (putty ターミナルを使用)、次のコマンドを通じてスクリプトを開始します。

コードは次のとおりです。

python test1.py &
ログイン後にコピー

これで、スクリプトは正常に実行され、プロセス番号は ps を通じて確認できます。この時点で、ssh ターミナルは (ps を使用せずに) 直接閉じられます。 exit コマンドですが、putty を介して直接実行されました) ボタン が実行されました)、再度ログインした後、プロセスが 終了 したことがわかりました。

バックグラウンド起動により問題は解決しました。今後の参考のためにここにまとめておきます。

linux はバックグラウンドで実行されます

fork によって実装されます
Linux 環境では、c のデーモン プロセスは fork によって実装されます。 Python はこの方法でも実装できます。サンプル コードは次のとおりです。

コードは次のとおりです。

#!/usr/bin/env python
import time,platform
import os
def funzioneDemo():
    # 这是具体业务函数示例
    fout = open('/tmp/demone.log', 'w')
    while True:
        fout.write(time.ctime()+'\n')
        fout.flush()
        time.sleep(2)
    fout.close()
def createDaemon():
    # fork进程        
    try:
        if os.fork() > 0: os._exit(0)
    except OSError, error:
        print 'fork #1 failed: %d (%s)' % (error.errno, error.strerror)
        os._exit(1)    
    os.chdir('/')
    os.setsid()
    os.umask(0)
    try:
        pid = os.fork()
        if pid > 0:
            print 'Daemon PID %d' % pid
            os._exit(0)
    except OSError, error:
        print 'fork #2 failed: %d (%s)' % (error.errno, error.strerror)
        os._exit(1)
    # 重定向标准IO
    sys.stdout.flush()
    sys.stderr.flush()
    si = file("/dev/null", 'r')
    so = file("/dev/null", 'a+')
    se = file("/dev/null", 'a+', 0)
    os.dup2(si.fileno(), sys.stdin.fileno())
    os.dup2(so.fileno(), sys.stdout.fileno())
    os.dup2(se.fileno(), sys.stderr.fileno())
    # 在子进程中执行代码
    funzioneDemo() # function demo
if name == 'main': 
    if platform.system() == "Linux":
        createDaemon()
    else:
        os._exit(0)
ログイン後にコピー

upstart メソッドを通じて実装されます

アプリケーションは upstart を通じてシステム サービスにカプセル化できます。完全な例はここに直接記録されています。

1. Python スクリプトを作成します

コードは次のとおりです。

[root@local t27]
# cat test123.py
#!/usr/bin/env python
import os,time
while True :    
print time.time()    
time.sleep(1)
ログイン後にコピー


2. upstat設定ファイル

コードは次のとおりです:

[root@local t27]
# cat /etc/init/mikeTest.confdescription "My test"author "Mike_Zhang@live.com"
start on runlevel [234]stop on runlevel [0156]
chdir /test/t27exec /test/t27/test123.pyrespawn
ログイン後にコピー

3. upstate をリロードします

コードは次のとおりです:

initctl reload-configuration
ログイン後にコピー

4. サービスを開始します

コードは次のとおりです:

[root@local t27]# start mikeTest
mikeTest start/running, process 6635
[root@local t27]# ps aux | grep test123.py
root      6635  0.0  0.0  22448  3716 ?        
Ss   09:55   0:00 python /test/t27/test123.py
root      6677  0.0  0.0 103212   752 pts/1   
 S+   09:56   0:00 grep test123.py
ログイン後にコピー


5. サービスを停止します

コードは次のとおりです:

[root@local t27]# stop mikeTest
mikeTest stop/waiting
[root@local t27]# ps aux | grep test123.py
root      6696  0.0  0.0 103212   752 pts/1    S+   09:56   0:00 grep test123.py
[root@local t27]#
ログイン後にコピー

達成bash スクリプトを介して

1、Python コード

コードは次のとおりです:

[root@local test]# cat test123.py#!/usr/bin/env python
import os,time
while True :    print time.time()    time.sleep(1)
ログイン後にコピー


2. 起動スクリプトを作成します

& を直接使用してプロセスを開始する場合:

[root@local test]# cat start.sh#! /bin/sh
python test123.py &
ログイン後にコピー

コードは次のとおりです:

SSH ターミナルを直接閉じると、プロセスが終了します。


screen、tmux などを介して実行します。

[root@local test]#./start.sh
ログイン後にコピー

プログラムを一時的に実行したい場合は、screen、tmux からプログラムを開始できます。 tmux の起動方法の説明。

1. tmux を起動します

python test123.py &
ログイン後にコピー

ターミナルに tmux と入力して起動します

2. tmux でプログラムを起動します

次のコマンドを直接実行します (上記のスクリプトを参照)。 python test123.py

3. SSH ターミナルを直接閉じます (putty の閉じるボタンなど)。 >

4. 再度 SSH を実行した後、次のコマンドを実行します。

コードは次のとおりです。

Python プログラムがまだ存在していることがわかります。通常どおり実行します。

Windows でのバックグラウンドでの実行

Windows では詳しく調べていませんが、私がよく使う方法は、Python スクリプトの拡張子を " に変更することです。 .pyw」をダブルクリックします。コードを変更せずにバックグラウンドで実行できます。
上記は、バックグラウンドで Python スクリプトを実行するいくつかの方法の内容です。さらに関連する内容については、PHP 中国語 Web サイト (www.php.cn) に注目してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート