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

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

新規登録して質問してみよう
ただいま回答率
86.12%
CGI

CGI(Common Gateway Interface)とは、Webサーバー上でユーザプログラム動作させる仕組みのこと。また、動かす前提のプログラムをCGIと呼ぶこともあります。HTMLなどの静的な情報に限らず、プログラムの処理結果をベースにした動的情報の提供が可能です。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

解決済

Linuxサーバで、CGIからのバックグラウンドプロセス開始方法

cellostar
cellostar

総合スコア11

CGI

CGI(Common Gateway Interface)とは、Webサーバー上でユーザプログラム動作させる仕組みのこと。また、動かす前提のプログラムをCGIと呼ぶこともあります。HTMLなどの静的な情報に限らず、プログラムの処理結果をベースにした動的情報の提供が可能です。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

2回答

0リアクション

0クリップ

169閲覧

投稿2022/08/28 03:55

前提

エックスサーバー(CentOS)上に次のようなものを実装したい。
・サーバー上で、常時pythonのプログラムを動かす
・そのプログラムを、筆者と他1名で共同開発
・そのために、コントロールページを作り、そこからプログラムの開始・停止・ソース編集などができるようにする

その第一段階として、コントロールページからpythonプログラムのバックグラウンド実行を試みています。

ソースコード

・コントロールページ

HTML

<html> <body> <form id="mainForm" action="run.rb" method="POST"> <button>コード実行</button> </form> </body> </html>

・run.rb(HTMLより呼び出し)

Ruby

#!/usr/bin/ruby puts "Content-Type: text/plain\n" puts "Access-Control-Allow-Methods: GET,POST\n" puts "Access-Control-Allow-Origin: *\n\n" # 方法1: spawn('python /home/xxx/xxx.xsrv.jp/script/test.py') # 方法2: System('nohup /home/xxx/xxx.xsrv.jp/script/test.py &')

・test.py(現段階では、一定間隔でlogファイルにhello worldを出すのみ)

Python

import time import datetime import sys import os print("プログラム開始") print(sys.version) f = open(os.path.dirname(__file__) + '/out.log', 'w') f.write(datetime.datetime.now().strftime('%Y年%m月%d日 %H:%M:%S')) f.write("\n処理開始\n") f.close() while True: f = open(os.path.dirname(__file__) + '/out.log', 'a') f.write(datetime.datetime.now().strftime('%Y年%m月%d日 %H:%M:%S')) f.write("\nhello world!\n") f.close() time.sleep(2) print("プログラム終了")

現状・問題点

サーバーにSSH接続し、ターミナルからrbファイルを実行すると、期待する動作になります。
(=バックグラウンドでpythonが動き続ける)
が、コントロールページからCGiを実行すると、
方法1の場合:画面に何も表示されず、プロセスもない(=実行されない)
方法2の場合:ページの読み込みが終わらない
という結果になってしまいます。
方法2について補足すると、コマンドを

nohup dir &

に変えると、ページ上にdirの結果が表示されることを確認しています。
つまり、nohupにしているにもかかわらず、プログラムの終了を待ち、その結果を出そうとしています。
(ページには以下の文言が出るだけで、コマンドの結果は出ない  というのを期待していたのですが。)

nohup: 出力を `nohup.out' に追記します

まとめ

CGIから、バックグラウンドプロセスを起動する方法をご教授いただきたいです。
Linuxなどについて殆ど知識がないので、おかしなことをしているのかもしれませんが、アドバイス頂けますと幸いです。- リスト

以下のような質問にはリアクションをつけましょう

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

リアクションが多い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

気になる質問をクリップする

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

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

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

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

適切な質問に修正を依頼しましょう。

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
86.12%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問

同じタグがついた質問を見る

CGI

CGI(Common Gateway Interface)とは、Webサーバー上でユーザプログラム動作させる仕組みのこと。また、動かす前提のプログラムをCGIと呼ぶこともあります。HTMLなどの静的な情報に限らず、プログラムの処理結果をベースにした動的情報の提供が可能です。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。