任意のコマンドをWEBブラウザから実行してみる


概要

寝転びながらサーバの情報を見たいことがあったので、コマンドを実行した結果がWEBブラウザから見れるようにしてみました。技術的には、Nginxでリクエスト時にシェルスクリプトが動作しHTMLで描画するようにしています。Dockerコンテナの上で動いているので移植も起動も簡単です。味気ないですが、好きなコマンドを追加したり、CSSで整えたりはお好みで・・

要件はこんな感じです。

  • 必要な時にだけ動作する。とても軽いこと
  • 動作中のプロセスのCPU/メモリ使用率が見れること
  • WEBブラウザから確認できること
  • カスタマイズが容易であること
  • Dockerコンテナで動作すること

使い方

  • (事前準備) dockerコマンドが使用できるようにしてください
  • (事前準備) docker-composeコマンドが使用できるようにしてください
  • リポジトリをクローンします。
git clone https://github.com/shun-sa/ps-webapp.git
cd ps-webapp
  • 起動します。
docker-compose up -d
  • http://<サーバのIP>:8081/top.sh にアクセス

カスタマイズ例

コマンドを追加したい

top.shに、見たいコマンドをcecho <コマンド>で書き足していけばOKです。psの場合はcecho psですね。

top.sh
#!/bin/sh

eval $QUERY_STRING
echo 'Content-type: text/html'  
echo ''

echo '<html>'
echo '<head></head>'
echo '<h1>Server Overview</h1>'

cecho(){
    echo "<h2>${@}</h2>"
    echo "<pre>"
    eval $@
    echo "</pre>"
}

# ここに足していく
cecho sensors
cecho top -b -n 1 -c | head -n 30

echo '<body>'

GPUの使用率が見たい

コンテナ内でnvidia-smiコマンドが実行できるなら、docker-compose.yml,top.shに以下を追記すれば見れます。

docker-compose.yml
    environment:
      - NVIDIA_DRIVER_CAPABILITIES=all
      - NVIDIA_VISIBLE_DEVICES=all
    runtime: nvidia
top.sh
cecho nvidia-smi

GETメソッドの引数を利用したい

GETメソッドで指定した値がスクリプト内で利用できます。URLにtestkeyを指定しtop.shで見てみるときちんと表示されています。あとはコマンドを渡したり、PIDを渡してプロセスを落としたり等はお好みで・・・

http://<サーバのIP>:8081/top.sh?testkey=val

top.sh
echo $testkey

⚠️注意

任意のコマンドが実行できる性質上、ホストマシンホストマシンを再起動したり、最悪の場合犯罪の踏み台に利用される可能性があります。インターネットから見れる場所に置くなどはやめましょう。