ジャンゴサイトの小規模なサーバー運用・保守を構築する - サーバープロセスを再起動します

ディレクトリ

  1. プロジェクトの説明とソースコード
  2. 使用されているブートストラップテンプレートを使用
  3. SSHサーバーサービスの構成およびparamikoでのpythonを使用します
  4. セッションでのユーザーログイン
  5. 最も簡単な練習は、サーバーの時刻を修正します
  6. 表示および変更、サーバーの構成やルーティングのデータベース
  7. 達成リアルタイムのログ用WebSocketに基づきます
  8. ログとサーバの先端を表示してDataTableを
  9. プロセス・サーバーを再起動します。

序文

  前の記事の面で同等の、この記事では、比較的簡単です。サーバーのバッチ処理が頻繁に再起動する必要がありますについて、一般的には、のようなparamikoサーバシェルスクリプトでちょうど関数呼び出しがある統一、機能的なWebページを実行するサーバー上でシェルスクリプトを作成した後、フロントで記録失敗と成功を再起動します記録。図に示すようにページ。

図1は、プロセスを再起動しました

達成するための機能

ページ表示

  • HTMLページの機能

  単に再起動モジュールと、再起動回数に構成された記録モジュールを実行することで、ページ。特定の実装において、バックグラウンド電流オペレータ、場合もちろん、再起動時にA、Bサイトが再起動を行っていない入力し、HTMLコード{{taskor}}変数の記録が再開される操作ミューテックスを教えてくれます。

{% extends "./base.html" %}

{% block css %}{% endblock %}
{% block title %}{{ title }}{% endblock %}
{% block log %}{{ title }}{% endblock %}
{% block username %}{{ username }}{% endblock %}

{% block mainbody %}
<section class="wrapper site-min-height">
    <div class="fakeloader"></div>
    <h3><i class="fa fa-angle-right"></i> 服务器重启 <i class="fa fa-refresh"></i></h3>
    <div class="row mt">
        <div class="col-lg-12">
            <div class="form-panel">
                <h4 class="mb"> 服务器重启</h4>
                {% if taskor != '' %}
                <div class="col-sm-12">
                    <div class="alert alert-danger"  id="loading-tips"><b>稍等~</b> 【{{taskor}}】正在重启进程...</div>
                </div>
                <div><br><br><br><br></div>
                {% else %}
                <div class="col-sm-12">
                    <div class="alert alert-danger" id="pre-tips"><b>注意!</b> 此操作将会导致进程重启。</div>
                    <div class="alert alert-danger" style="display:none;" id="loading-tips"><b>稍等~</b> 进程正在重启...</div>
                    <div class="progress progress-striped active" style="display:none;" id="loading">
                        <div class="progress-bar" role="progressbar" aria-valuenow="100" aria-valuemin="0" aria-valuemax="100" style="width: 100%"></div>
                    </div>
                </div>
                <div><br><br><br><br></div>
                <div class="col-sm-12" style="text-align: right">
                    <button type="button" id="restart" class="btn btn-theme04">重启服务器</button>
                </div>
                <div><br><br><br></div>
                {% endif %}
            </div>
        </div>
    </div>
    <div class="row mt">
        <div class="col-lg-12">
            <div class="form-panel">
                <h4 class="mb"> 重启服务器的记录</h4>
                <table class="table table-hover">
                    <thead>
                    <tr>
                        <th style="width:10%;">重启时间</th>
                        <th style="width:10%;">重启人</th>
                        <th style="width:10%;">重启是否成功</th>
                    </tr>
                    </thead>
                    <tbody id="tab">
                    {% for item in reboot %}
                    <tr>
                        <td>{{ item.reboottime }}</td>
                        <td>{{ item.rebooter }}</td>
                        <td>{{ item.rebootresult }}</td>
                    </tr>
                    {% endfor %}
                    </tbody>
                </table>
            </div>
        </div>
    </div>
</section>
{% endblock %}
  • ページjavascript関数

  ページのJavaScript関数のみ、図1で使用される唯一のボタンで再起動するバッチ処理ボタンがその参照記事に対して、図2に示され、想起をクリックするたびにアクションを(SwaIでモーダルボックスプラグインのちょうど機能、ユーザログインセッションは、)AJAXによるバックエンド処理の機能要求を挙げます。

図2のSwaIプラグ

{% block scripts %}
<script>
$(document).ready(function(){
    $("#restart").click(function(){
    swal({
        title: '您确定要重启吗?',
        type: 'warning',
        confirmButtonColor: '#DD6B55',
        confirmButtonText:"是的,我要重启!",  
        cancelButtonText:"让我再考虑一下…",
        showLoaderOnConfirm: true, //加载按钮是否可见  
        showCancelButton: true,
        preConfirm: function() {  
            return new Promise(function(resolve) {  
                setTimeout(function(){
                    $("#restart").hide();
                    $("#pre-tips").hide();
                    $("#loading-tips").show();
                    $("#loading").show();
                    resolve();  
                }, 3000);  
            });  
        },  
        allowOutsideClick: false, //弹框外是否可点
        }).then(function(res){
        if (res){
        $.ajax({
            url:"restartserver",
            type:'GET',
            success: function(arg){
                ret = eval(arg);
                if(ret.status){
                    swal({  
                        type: 'success',  
                        title: '重启完成!',  
                        confirmButtonText: '确定',  
                        confirmButtonColor: '#4cd964'  
                        }).then(function(){
                            window.location.reload();
                            });  
                }else{
                    swal({  
                        type: 'error',  
                        title: '重启失败!',  
                        confirmButtonText: '确定',  
                        confirmButtonColor: '#4cd964'  
                        }).then(function(){
                            window.location.reload();
                        });  
                }
            }});
        }})
    });
});
</script>
{% endblock %}
  • モデル関数を作成します。

  ここで2つのモデル関数を作成しているサーバーの時間の練習を簡単に変更 in've taskinbackgroundを述べ、それがデータベースで進行中のイベント記録することができ、他のレコードのテーブルrebootserverの再起動操作です。

# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.db import models


class taskinbackground(models.Model):
    taskname = models.CharField(max_length=50)
    taskor = models.CharField(max_length=100)

    class Meta:
        db_table = 'task'
        app_label = "server"
        
     
class rebootserver(models.Model):
    rebooter = models.CharField(max_length=100)
    reboottime = models.CharField(max_length=200, default="")
    rebootresult = models.CharField(max_length=200, default="")

    class Meta:
        db_table = 'reboot'
        app_label = "server"
  • URLとビュー機能を増やします

  サーバー/ urls.py追加リブートとrestartserver、前者はリスタート機能を達成するために使用されているページをレンダリングするために使用されます。

from django.conf.urls import url
import views

urlpatterns = [
    url(r'^reboot', views.rebootserver),
    url(r'^restartserver', views.restartserver),
]

  関数rebootserverでページサーバ/ views.py、およびパフォーマンス機能restartserverの再起動をレンダリングするために追加。

# -*- coding: utf-8 -*-
from __future__ import unicode_literals

from django.contrib.auth import logout
from django.shortcuts import render_to_response
from django.http import JsonResponse
from django.contrib.auth.decorators import login_required
import json
import time

# 服务器的名字
htmltitle = '服务器工具'


# 渲染页面
@login_required(login_url='/loginpage')
def rebootserver(request):
    from server import models
    username = request.session.get('username')
    # 取出数据库后10条重启的数据
    reboot = models.rebootserver.objects.all()[::-1][0:10]
    taskor = ''
    try:
        # 后台是否有其他人在重启
        taskor = models.taskinbackground.objects.get(taskname='reboot').taskor
    except Exception as e:
        print e
    pagedict = {'reboot': reboot, 'title': htmltitle, 'taskor': taskor, 'username': username}
    return render_to_response("servermaterial/reboot.html", pagedict)
    
    
# 重启进程
def restartserver(request):
    if request.method == 'GET':
        ret = {'status': False}
        from WebTool.functions import rebootserver
        from server import models
        username = request.session.get('username')
        models.taskinbackground.objects.filter(taskname='reboot').delete()
        # 将重启进程的任务写进数据库
        models.taskinbackground.objects.create(taskname='reboot', taskor=username)
        res = rebootserver()
        local_time = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
        if res == 'Successful Rebooted!':
            ret['status'] = True
            # 重启成功记录写入rebootserver中
            models.rebootserver.objects.create(rebooter=username, reboottime=local_time, rebootresult='重启成功')
            # 从taskinbackground中删除后台正在执行的重启任务
            models.taskinbackground.objects.filter(taskname='reboot').delete()
            return JsonResponse(ret)
        elif res == 'Unsuccessful Rebooted!':
            # 重启失败记录写入rebootserver中
            models.rebootserver.objects.create(rebooter=username, reboottime=local_time, rebootresult='重启失败')
            # 从taskinbackground中删除后台正在执行的重启任务
            models.taskinbackground.objects.filter(taskname='reboot').delete()
            ret['status'] = False
            return JsonResponse(ret)
        else:
            models.rebootserver.objects.create(rebooter=username, reboottime=local_time, rebootresult='重启失败')
            models.taskinbackground.objects.filter(taskname='reboot').delete()
            ret['status'] = False
            return JsonResponse(ret)

  (Webツール/ Webツール/ functions.py)機能に書き込む処理、ここで私たちの再起動rebootserver paramiko機能を参照してください 、 ではないため、そのLinux環境の場合、シミュレーション・プロセスを再起動するシェルスクリプトを書かなければなりませんでした。詳細については、記事に会場くださいparamiko中のpythonのサーバーSSHサービスの設定と使用

操作排他

  記事のサーバー時間の練習の最も簡単な修正は、 Aの修正時間は、他の人が時間を変更することはできませんときに、モデルに書き込み、バックグラウンドタスクとしてプロセスを再起動します、ここで使用される方法は、同じ理由で、言及したときに、タスクの実行他の人でtaskinbackgroundがページを開くと、ページのレンダリング機能は、データベースでそれを見ていきます、タスクの該当する名前はありませんtaskor = models.taskinbackground.objects.get(taskname='reboot').taskor
再起動は機能、図3に示すような効果を提供しない場合。

再起動の過程で他の3人

{% if taskor != '' %}
<div class="col-sm-12">
    <div class="alert alert-danger"  id="loading-tips"><b>稍等~</b> 【{{taskor}}】正在重启进程...</div>
</div>
<div><br><br><br><br></div>
{% else %}
<div class="col-sm-12">
    <div class="alert alert-danger" id="pre-tips"><b>注意!</b> 此操作将会导致进程重启。</div>
    <div class="alert alert-danger" style="display:none;" id="loading-tips"><b>稍等~</b> 进程正在重启...</div>
    <div class="progress progress-striped active" style="display:none;" id="loading">
    <div class="progress-bar" role="progressbar" aria-valuenow="100" aria-valuemin="0" aria-valuemax="100" style="width: 100%"></div>
    </div>
    </div>
    <div><br><br><br><br></div>
    <div class="col-sm-12" style="text-align: right">
        <button type="button" id="restart" class="btn btn-theme04">重启服务器</button>
    </div>
    <div><br><br><br></div>
{% endif %}

  ロジックは、図4、図で説明し、以下の相互に排他的な論理を使用することができます。実際には、と等価である、人気のポイントデータベースは、タスクを実行するために一度だけ許され、1つのスレッドのミューテックスを作りました

4再起動相互に排他的

エピローグ

  この記事では、単純にバッチ実行プロセスの再起動にサイトのバックを呼び出し、その後、同時に複数のユーザーを防ぐために、ミューテックスで、単純なデータベーステーブルを行う方法を次を使用します。

おすすめ

転載: www.cnblogs.com/homehtml/p/11930514.html