ウェブサイトでプログラムを開始/停止

ウェブサイトでプログラムを開始/停止

私のコンピュータには、小さなMumble Voice Serverを実行できるユーザーがいくつかいます。私は彼らがウェブサイト(Apacheによって実行されている)で音声サーバーを起動/停止できるようにしたいと思います。現在の設定では、各サーバーを別のユーザー(その人の特定のユーザーアカウント)として実行します。

私が知らないのは、サーバーをすぐに起動/停止する最良の方法です。現在、Webサイトでサービスを開始/停止しようとするたびにデータベースにエントリを作成します。その後、毎分実行され、データベースでこれらの起動/停止を検索するcronスクリプトがあります。 cronスクリプトはユーザーアカウントに切り替え、そのユーザーとしてサーバーを実行します。私の問題は、これが起こるのに約1分かかることがあるということです。

これを達成するためのより敏感な方法はありますか?

答え1

データベースに書き込むことに加えて、名前付きパイプに書き込むことを検討しましたか?ユーザーごとに名前付きパイプを作成し、各名前付きパイプを監視するプロセスを作成できます。 「restart」コマンドが来たら、すぐにプロセスを再起動してください。

これは完全な解決策ではなく改善することができますが、名前付きパイプを監視してプロセスを再開する方法についてのアイデアを提供する必要があります。

while read line <$pipe
 do
  if [[ "$line" == 'restart' ]]; then
    restart_some_service
  fi
done

答え2

これは少し過ぎるかもしれませんが、考えたことがありますか?ユーザー分?彼らはプロセスプラグインをリストします標準プラグイン、ユーザーが次のことを可能にします。

システムで実行されているすべてのプロセスを表示し、[それら]に属するプロセスを終了して新しいプロセスを開始します。

これを試したことがない、ちょうどそれはかなり、まあ、「プロフェッショナル」であると思いました。 )

編集する 「ムンブル」に関してはすでにいくつかのWebインターフェースがあります。しかし、あなたの場合に役立つかもしれません。 )

答え3

サーバーをホストしている人が信頼でき、サーバーにスパム/ハッキングを行わない場合は、起動/停止をシェルに直接渡すようにWebインターフェースをプログラムすることはどうですか?

たとえば、PHPでは、次のようにページにプログラムできます。

<?php
  // checks, templating, blah, blah, blah
  $status = exec('/path/to/service/mumbled status')

  if ($status == "stopped")
    // display start button, hook exec('mumbled stop') command to it

  if ($status == "running")
    // display stop button, hook exec('mumbled start') command to it
?>

国ならその道に行くだろうが、それがまさに私だ。

答え4

あなたのクローンの方法は正しいです。他のほとんどの方法にはさまざまなセキュリティ問題があります。同じアイデアをより早く取得するには、ファイルをタッチしてinotifyを使用してファイルが変更されたかどうかを検出します。 inotifyは非常に高速です。 「inotify-tools」は、inotifyを使用するための使いやすいコマンドラインツールセットです。 inotify-tools githubサイトにはいくつかの良い例があります。

から: https://github.com/rvoicilas/inotify-tools/wiki/#wiki-info

#!/bin/sh
EVENT=$(inotifywait --format '%e' ~/file1)
[ $? != 0 ] && exit
[ "$EVENT" = "MODIFY" ] && echo 'file modified!'
[ "$EVENT" = "DELETE_SELF" ] && echo 'file deleted!'

基本的には即時です。 inotifyはカーネル機能であり、これらのツールはカーネルを利用して特定のファイルシステムイベントに対する要求を通知します。

関連情報