django搭建一个小型的服务器运维网站-重启服务器的进程

目录

  1. 项目介绍和源码
  2. 拿来即用的bootstrap模板
  3. 服务器SSH服务配置与python中paramiko的使用
  4. 用户登陆与session;
  5. 最简单的实践之修改服务器时间
  6. 查看和修改服务器配置与数据库的路由
  7. 基于websocket的实时日志实现
  8. 查看服务器中的日志与前端的datatable的利用
  9. 重启服务器的进程。

前言

  相当于前面的文章而言,这篇文章就比较简短了。关于服务器中进程需要经常批量的重启,一般会在服务器中写个shell脚本去统一执行,网页的功能仅仅是用paramiko函数调用服务器中的shell脚本就好,然后把失败和成功的重启记录在前端记录下来。页面如图1所示。

图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中唯一一个按钮批量重启进程作用(函数中的swal只是一个模态框插件,每当点击按钮时唤起,如图2,关于它的引用文章用户登陆与session提到过),函数通过ajax请求到后端处理。

图2 swal插件

{% 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 %}
  • 创建model函数

  这里会创建两个model函数,一个在最简单的实践之修改服务器时间中提到过的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和view函数

  server/urls.py中添加reboot和restartserver,前者用来渲染页面的,后者是用来实现重启的功能。

from django.conf.urls import url
import views

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

  server/views.py中添加渲染页面的函数rebootserver,和重启的功能函数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)

  看到这里,我们的重启进程的paramiko函数rebootserver写在functions(WebTool/WebTool/functions.py)中,由于自己的Linux没有环境,当时只好写了一个shell脚本模拟进程重启。具体内容请移步至文章服务器SSH服务配置与python中paramiko的使用

操作互斥

  文章最简单的实践之修改服务器时间提到过,当A修改时间时,其他人没法修改时间,这里用的方法也是同理,将重启进程看成一个后台任务,任务执行时写在model中的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描述。通俗点说,其实就相当于用数据库做了一个互斥量,一次只准一个线程执行任务

图4 重启互斥

结语

  这篇文章简单的说了下怎么去用网站调用后台去批量执行进程重启,然后用数据库的表做一个简单的互斥量,防止多个用户同时操作。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
搭建一个博客网站可以分为以下几个步骤: 1. 安装 Django 首先需要安装 Django,可以通过 pip 命令进行安装: ``` pip install django ``` 2. 创建 Django 项目 在命令行中进入要创建项目的目录,然后运行以下命令: ``` django-admin startproject myblog ``` 这会在当前目录下创建一个名为 myblog 的 Django 项目。 3. 创建应用 在 Django 中,可以通过应用来组织代码。一个 Django 项目可以包含多个应用。运行以下命令创建一个名为 blog 的应用: ``` python manage.py startapp blog ``` 这会在 myblog 目录下创建一个名为 blog 的应用。 4. 配置数据库 Django 默认使用 SQLite3 数据库,可以在 myblog/settings.py 文件中进行配置。例如,将数据库改为 MySQL: ```python DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': 'myblog', 'USER': 'mybloguser', 'PASSWORD': 'mypassword', 'HOST': 'localhost', 'PORT': '3306', } } ``` 5. 定义模型 在 blog 应用中,可以定义模型来描述博客文章的结构。打开 blog/models.py 文件,添加以下内容: ```python from django.db import models class Post(models.Model): title = models.CharField(max_length=200) content = models.TextField() pub_date = models.DateTimeField(auto_now_add=True) ``` 6. 创建数据库表 运行以下命令创建数据库表: ``` python manage.py makemigrations python manage.py migrate ``` 7. 创建视图 在 blog/views.py 文件中创建视图函数: ```python from django.shortcuts import render from blog.models import Post def post_list(request): posts = Post.objects.all() return render(request, 'blog/post_list.html', {'posts': posts}) ``` 8. 创建模板 在 blog/templates/blog 目录下创建一个名为 post_list.html 的模板文件,添加以下内容: ```html {% for post in posts %} <h2>{{ post.title }}</h2> <p>{{ post.content }}</p> <p>{{ post.pub_date }}</p> {% endfor %} ``` 9. 配置 URL 在 myblog/urls.py 文件中添加以下内容: ```python from django.urls import path from blog.views import post_list urlpatterns = [ path('', post_list, name='post_list'), ] ``` 10. 运行开发服务器 运行以下命令启动 Django 开发服务器: ``` python manage.py runserver ``` 11. 浏览网站 在浏览器中访问 http://localhost:8000/,可以看到博客文章列表。 以上是 Django 搭建一个博客网站的基本步骤,可以根据实际需要进行扩展和修改。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值