前提
エックスサーバー(CentOS)上に次のようなものを実装したい。
・サーバー上で、常時pythonのプログラムを動かす
・そのプログラムを、筆者と他1名で共同開発
・そのために、コントロールページを作り、そこからプログラムの開始・停止・ソース編集などができるようにする
その第一段階として、コントロールページからpythonプログラムのバックグラウンド実行を試みています。
ソースコード
・コントロールページ
HTML
1<html> 2<body> 3<form id="mainForm" action="run.rb" method="POST"> 4 <button>コード実行</button> 5</form> 6</body> 7</html>
・run.rb(HTMLより呼び出し)
Ruby
1#!/usr/bin/ruby 2 3puts "Content-Type: text/plain\n" 4puts "Access-Control-Allow-Methods: GET,POST\n" 5puts "Access-Control-Allow-Origin: *\n\n" 6 7# 方法1: 8spawn('python /home/xxx/xxx.xsrv.jp/script/test.py') 9 10# 方法2: 11System('nohup /home/xxx/xxx.xsrv.jp/script/test.py &')
・test.py(現段階では、一定間隔でlogファイルにhello worldを出すのみ)
Python
1import time 2import datetime 3import sys 4import os 5 6print("プログラム開始") 7print(sys.version) 8 9f = open(os.path.dirname(__file__) + '/out.log', 'w') 10f.write(datetime.datetime.now().strftime('%Y年%m月%d日 %H:%M:%S')) 11f.write("\n処理開始\n") 12f.close() 13 14while True: 15 f = open(os.path.dirname(__file__) + '/out.log', 'a') 16 f.write(datetime.datetime.now().strftime('%Y年%m月%d日 %H:%M:%S')) 17 f.write("\nhello world!\n") 18 f.close() 19 time.sleep(2) 20 21print("プログラム終了")
現状・問題点
サーバーにSSH接続し、ターミナルからrbファイルを実行すると、期待する動作になります。
(=バックグラウンドでpythonが動き続ける)
が、コントロールページからCGiを実行すると、
方法1の場合:画面に何も表示されず、プロセスもない(=実行されない)
方法2の場合:ページの読み込みが終わらない
という結果になってしまいます。
方法2について補足すると、コマンドを
nohup dir &
に変えると、ページ上にdirの結果が表示されることを確認しています。
つまり、nohupにしているにもかかわらず、プログラムの終了を待ち、その結果を出そうとしています。
(ページには以下の文言が出るだけで、コマンドの結果は出ない というのを期待していたのですが。)
nohup: 出力を `nohup.out' に追記します
まとめ
CGIから、バックグラウンドプロセスを起動する方法をご教授いただきたいです。
Linuxなどについて殆ど知識がないので、おかしなことをしているのかもしれませんが、アドバイス頂けますと幸いです。- リスト
回答2件
あなたの回答
tips
プレビュー
下記のような回答は推奨されていません。
このような回答には修正を依頼しましょう。
また依頼した内容が修正された場合は、修正依頼を取り消すようにしましょう。
2022/08/29 01:24
2022/08/29 10:08