shell脚本一,shell脚本

设置环境变量常见的地方为区分开发环境/生产环境,或者定义一些数据库的帐号密码

进程监控工具supervisor 启动Mongodb

shell脚本一,shell脚本

    在一些复杂的Linux维护工作中,大量重复的输入和交互操作不但费时费力,容易出错.这时候就需要用到脚本。

  编写脚本的好处:  批量的处理,自动化的完成维护,减轻管理员的负担。

  linux的shell脚本是一种特殊的应用程序,常见的shell解释器有很多种,使用不同的shell时期内部指令:cat
/etc/shells 

[[email protected]
~]# cat /etc/shells
图片 1

/bin/bash是大多数linux中默认的shell解释器。之后的所有脚本的编写都是bash脚本。

 

设置Apache环境变量

一什么是supervisor

一、编写第一个Shell脚本

将平时的操作命令顺序的放入到文件中赋予执行权限,一次的执行。

我们来编写第一个脚本first.sh

linux不以后缀名区分文件,为了方便记忆这里我就以.sh为结尾

[[email protected]
~]# vim first.sh

 图片 2

注释:

#!/bin/bash 主要是为了声明,我所写的均为bash语言(我是用的是bash解释器)

第二行为注释行,注释信息不生效

当写一个比较大的脚本时,如果没有一个好的注释,那么也就也就没有人都能够看懂其中的意思了

再往后即执行的命令。

执行过程:

 

[[email protected]
~]# ll first.sh                            #查看是否具有执行权限
-rw-r–r–. 1 root root 62 Aug 30 22:58 first.sh   
[[email protected]
~]# chmod +x first.sh              #给脚本添加执行权限
[[email protected]
~]# ll first.sh                           #查看脚本是否具有执行权限
-rwxr-xr-x. 1 root root 62 Aug 30 22:58 first.sh
[[email protected]
~]# ./first.sh                           #执行脚本

执行的结果:

图片 3

 

E-执行脚本的不同方式

第一种使用绝对路径执行

第二种使用相对路径执行,如./的方式

第三种使用 sh命令来执行  格式  sh 脚本名   不需要执行权限    -x参数

第四种使用 . (空格)脚本名称的方式执行  不需要执行权限  .  first.sh

第五种使用 source 脚本名称        不需要执行权限(主要用于生效配置文件)

#建议使用后三种,在生产环境中不要轻易的给文件可执行权限;

指令

设置当前环境变量为DEV

SetEnv RUNTIME_ENVIROMENT DEV

数据库帐号密码

SetEnv MYSQL_USERNAME root
SetEnv MYSQL_PASSWORD root

Superviosr是一个UNIX-like系统上的进程监控工具。
Supervisor是一个Python开发的client/server系统,可以管理和监控*nix上面的进程。不过同daemontools一样,它也不能监控daemon进程

二、 脚本中的变量。

变量的定义是:可以存放一个可变的值的空间

可以通过不同的环境进行改变就是一个可以变的值.

默认情况下:
在Linux中可以将每个shell看成不同的执行环境,所以相同的一个变量名称在不同的变量执行环境中的变量值是不同的.

常见的shell变量分类:

自定义变量、环境变量、位置变量、预定义变量

变量的输出

一般使用echo 输出变量   echo $变量名

配置文件格式

<VirtualHost *:80>
    ServerAdmin admin@admin.com
    DocumentRoot "/var/www/"
    ServerName localhost
    SetEnv RUNTIME_ENVIROMENT DEV
    SetEnv MYSQL_USERNAME root
    SetEnv MYSQL_PASSWORD root
    ErrorLog "logs/error.log"
    CustomLog "logs/access.log" common
</VirtualHost>

官网: 

1.自定义变量

举例1:来进行定义一个变量名字为Linux值为7.2 

[[email protected]
~]# Linux=7.2      #为变量Linux赋值

[[email protected]
~]# echo $Linux    #输出变量Linux的值

7.2

[[email protected]
~]# linux=6.5      #为变量linux赋值

[[email protected]
~]# echo $linux      #输出变量linux的值

6.5

图片 4

可以直接在命令行定义一个变量并赋予值,通过echo进行输出变量
$是引用变量的特殊字符(必须使用$符号)

**注意:echo和调用的变量之间必须要有空格。**

          大小写的变量的值是不同的。

举例2:当需要一起调用两组变量时

[[email protected]
~]# echo $Linux $linux

7.2 6.5

直接使用echo 后面跟$调用的变量 如果有多个则空格隔开

举例3:当变量名和后面的字符容易混淆的时候应该使用{}将变量名括起来

[[email protected]
~]# echo system${Linux}

system7.2

[[email protected]
~]# echo ${Linux}system

7.2system

其他的特殊操作

双引号( ”  “)

当=号右边赋值出现空格的时候,需要使用双引号将其扩起

图片 5

[[email protected]
~]# webserver=”nginx 1.1″
[[email protected]
~]# echo $webserver
nginx 1.1

图片 6

#在双引号的范围内还可以引用其他的变量,从而能够将现有的变量赋值给新的变量

 

[[email protected]
~]# Linux=7.2
[[email protected]
~]# system=”RHEL$Linux”
[[email protected]
~]# echo $system
RHEL7.2
[[email protected]
~]#

 

图片 7

单引号( ‘ ‘)

  
当要赋值的内容包括”$”、””等,具有其他含义的特殊字符时,应使用单引号将其括起来;

在单引号范围内将无法引用其他的值,任何字符均作为普通字符看待,但赋值
的内容包含单引号时需要使用’符号进行转义以免冲突.

[[email protected]
~]# kernel=3.10$Linux
[[email protected]
~]# echo $kernel   
3.107.2                  
#这个结果不是我们想要的,我们想要的结果是$3.10$Linux
[[email protected]
~]# kernel=’3.10$Linux’
[[email protected]
~]# echo $kernel    
3.10$Linux
[[email protected]
~]#

图片 8

反撇号( ` `)

  位置在键盘esc的下边的按键。

反撇号主要使用于命令替换,允许将某个命令的屏幕输出结果赋值给变量。

举例: 在命令行中查找程序的详细的信息

[[email protected]
~]# rpm -qf `which pwd`
coreutils-8.22-15.el7.x86_64
[[email protected]
~]# rpm -qf $(which pwd)
coreutils-8.22-15.el7.x86_64
[[email protected]
~]# which pwd
/usr/bin/pwd
[[email protected]
~]# rpm -qf /usr/bin/pwd
coreutils-8.22-15.el7.x86_64
[[email protected]
~]#

图片 9

#反撇号括起来的范围内必须是可执行的命令。否则将会出现错误

需要注意的是使用反撇号难以在一条命令中实现嵌套命令的操作,这是可以$()来替代反撇号

如果使用反撇号嵌套会出错的!!

[[email protected]
~]# rpm -q `rpm -qf `which pwd“

rpm: no arguments given for query

which-2.20-7.el7.x86_64

package pwd is not installed

建议使用$()的形式嵌套

 [[email protected]
~]# rpm -q $(rpm -qf $(which pwd))

coreutils-8.22-15.el7.x86_64

 图片 10

read命令

除了上面的赋值之外还可以使用read命令进行赋值,read命令用来提示用户输入信息,从而实现简单的交互式过程(其实我们所输入的命令就是一种交互式的过程)

执行时需要从标准输入设备键盘读取一行,并以空格为分隔符

[[email protected]
~]# read kernel Linux    #同时定义两个变量操作   
4.7.2 7.2       –>手动输入的变量值
[[email protected]
~]# echo $kernel
4.7.2
[[email protected]
~]# echo $Linux
7.2

 图片 11

图片 12

为了交互式更加的形象,提高易用性,加上 -p选项来设置提示信息

 

[[email protected]
~]# read -p “input your password:” passwd    #-p 指定提示信息
input your password:123456              #123456就是$passwd的值
[[email protected]
~]# echo $passwd        #输出变量  
123456

图片 13


以上的操作只是在当前的bash环境下生效,到了其他控制台或者是其他shell就不能生效了 

我们进入当前shell的子shell验证:

 

[[email protected]
~]# echo $Linux   #在当前的shell环境输出变量
7.2
[[email protected]
~]# bash            #切换子shell
[[email protected]
~]# echo $Linux    #在子shell环境输出变量

                                                        #没有输出东西。

[[email protected]
~]#

图片 14

也可以先定义一个全局变量并赋值:

[[email protected]
~]# export website=www.baidu.com   #设置全局变量

[[email protected]
~]# echo $website      #在当前环境输出变量
www.baidu.com     
[[email protected]
~]# bash                  #进入子shell      
[[email protected]
~]# echo $website     #输出子shell中的变量
www.baidu.com
[[email protected]
~]#

 图片 15

需要注意的是变量的名是严格区分大小写的

设置Nginx环境变量

二为啥用supervisor

数值变量的运算:

shell脚本的数值运算多用于脚本程序的过程控制(如循环次数,使用量比较等)

在shell环境中,只能进行比较简单的整数运算

运算符与变量之间必须有一个空各位,整数的运算主要是通过内部命令expr
命令进行运算。

 

格式  变量1 运算符 变量2

其中 变量1 、变量2
……对应的需要计算的数值变量(需要$符号调用)常用的几种运算符如下所示

加法运算:+

减法运算: –

乘法运算: *

除法运算: /

求模(取余)运算: % 

 图片 16

若要将运算结果赋值给其他变量可以这么做

图片 17

指令

设置当前环境变量为DEV

fastcgi_param RUNTIME_ENVIROMENT 'DEV'

数据库帐号密码

fastcgi_param MYSQL_USERNAME 'root'
fastcgi_param MYSQL_PASSWORD 'root'

 

2. 环境变量

  环境变量是指系统本身运行需要由linux系统提前创建好的一类变量。

主要用于用户的工作环境,包括(用户的宿主目录,命令的查找路径,用户的当前目录,登录的终端等)环境变量的值由操作系统本身自己维护,随着用户的状态改变而改变

env调取当前环境变量

图片 18

环境变量的配置文件在/etc/profile(全局)

用户宿主目录/home/berners/.bash_profile(局部)
#我非root用户是berners. 

 

$PWD 

pwd命令就是调用了这个变量才能进行输出

图片 19

$PATH

定义命令的默认搜索路径,我们讲的mysql可执行程序优化的时候我们是直接将程序路径写到了这个变量中才可以再任何目录下进行输入.

图片 20

$USER

就是当前登陆系统的用户

图片 21

$SHELL

显示当前所用的shell

图片 22

$HOME

显示当前用户的家目录。一般非root用户的家目录都在/home目录下,有个以当前用户命名的目录。root用户家目录在/root下。

由/etc/passwd的倒数第二个域决定

 图片 23

图片 24

将我们所写的脚本放到$PATH的默认搜索路径中去

1.将/root目录写入到PATH的环境变量中,但是还没有永久生效。

图片 25

 

 

2.刷新一下/etc/profile
配置文件,并不会永久生效,甚至在另外一个窗口也没有生效,只能直接修改配置文件。

图片 26

3.之后/root下的可执行程序可以在任何目录下直接执行执行不许要任何命令去执行

 

在一些复杂的Linux维护工作中,大量重复的输入和交互操作不但费时费力,容易出错.这时候就需要用到脚本。
编写脚…

配置文件格式

在fastcgi_params文件中配置

fastcgi_param RUNTIME_ENVIROMENT 'DEV';
fastcgi_param MYSQL_USERNAME 'root';
fastcgi_param MYSQL_PASSWORD 'root';

在nginx.conf中配置

server {
    listen   80; 
    root /var/www;
    index index.php;
    server_name localhost;
    location /
    {   
         index index.php;
    }   

    location ~ .*.(php|php5)?$ {
        fastcgi_pass 127.0.0.1:9000;
        fastcgi_index index.php;
        include fastcgi_params;
    }   
}

 部署简单 :
为啥简单呢?因为咱们通常管理linux进程的时候,一般来说都需要自己编写一个能够实现进程start/stop/restart/reload功能的脚本,然后丢到/etc/init.d/下面。这么做有很多不好的地方,第一我们要编写这个脚本,这就很耗时耗力了。第二,当这个进程挂掉的时候,linux不会自动重启它的,想要自动重启的话,我们还要自己写一个监控重启脚本。而,supervisor则可以完美的解决这些问题。好,怎么解决的呢,其实supervisor管理进程,就是通过fork/exec的方式把这些被管理的进程,当作supervisor的子进程来启动。这样的话,我们只要在supervisor的配置文件中,把要管理的进程的可执行文件的路径写进去就OK了。这样就省下了我们如同linux管理进程的时候,自己写控制脚本的麻烦了。第二,被管理进程作为supervisor的子进程,当子进程挂掉的时候,父进程可以准确获取子进程挂掉的信息的,所以当然也就可以对挂掉的子进程进行自动重启了,当然重启还是不重启,也要看你的配置文件里面有木有设置autostart=true了,这是后话。

为PHP脚本设置环境变量

   集中管理:
supervisor管理的进程,进程组信息,全部都写在一个ini格式的文件里就OK了。而且,我们管理supervisor的时候的可以在本地进行管理,也可以远程管理,而且supervisor提供了一个web界面,我们可以在web界面上监控,管理进程。
当然了,本地,远程和web管理的时候,需要调用supervisor的xml_rpc接口,这个也是后话。

为当前用户临时设置

临时设置只需要执行

export KEY=VALUE

  supervisor管理的进程,进程组信息,全部都写在一个ini格式的文件里就OK了。而且,我们管理supervisor的时候的可以在本地进行管理,也可以远程管理,而且supervisor提供了一个web界面,我们可以在web界面上监控,管理进程。
当然了,本地,远程和web管理的时候,需要调用supervisor的xml_rpc接口,这个也是后话。

为当前用户永久设置

~/.bashrc(不同系统各有不同)中写

精确

为所有用户(不包括root)设置

创建文件/etc/profile.d/test.sh,写入

KEY=VALUE

为啥说精确呢?因为linux对进程状态的反馈,有时候不太准确。为啥不准确?这个楼主也不知道啊,官方文档是这么说的,知道的告诉楼主一下吧,感激不尽。而supervisor监控子进程,得到的子进程状态无疑是准确的。

为所有用户(包括root)设置

/etc/environment中写入

KEY=VALUE

注意,这个文件的生效时间是用户登录时,所以对于root来说,需要重启机器

进程组

在Supervisor中设置

有的时候PHP脚本是用Supervisor来控制的,所以记得设置supervisor配置中的environment项

supervisor可以对进程组统一管理,也就是说咱们可以把需要管理的进程写到一个组里面,然后我们把这个组作为一个对象进行管理,如启动,停止,重启等等操作。而linux系统则是没有这种功能的,我们想要停止一个进程,只能一个一个的去停止,要么就自己写个脚本去批量停止。

在PHP中调用服务器环境变量

在PHP中有两个调用方式:

$env = getenv('RUNTIME_ENVIROMENT');

还有超全局变量方式:

$env = $_SERVER['RUNTIME_ENVIROMENT'];

权限

大伙都知道linux的进程,特别是侦听在1024端口之下的进程,一般用户大多数情况下,是不能对其进行控制的。想要控制的话,必须要有root权限。而supervisor提供了一个功能,可以为supervisord或者每个子进程,设置一个非root的user,这个user就可以管理它对应的进程了。

不过这功能,用不用就看大伙自己的环境了

supervisor结构

Supervisord
:主进程,负责管理进程的server,它会根据配置文件创建指定数量的应用程序的子进程,管理子进程的整个生命周期,对crash的进程重启,对进程变化发送事件通知等。同时内置web
server和XML-RPC Interface,轻松实现进程管理。

Supervisorctl:
管理client,用户通过命令行发送消息给supervisord,可以查看进程状态,加载配置文件,启停进程,查看进程标准输出和错误输出,远程操作等。

Web server: superviosr提供了web server功能,可通过web控制进程。

XML-RPC interface:
XML-RPC接口,提供XML-RPC服务来对子进程进行管理,监控

四安装部署

为了统一python版本和各种依赖库,推荐使用pyrun代替系统的python进行部署,同时需要在pyrun安装pip,将安装包下载至pkg目录,执行如下命令:

/data/pyrun/bin/pip install –no-index -f pkg meld3==1.0.0

/data/pyrun/bin/pip install –no-index -f pkg
elementtree==1.2.6-20050316

/data/pyrun/bin/pip install –no-index -f pkg supervisor==3.2.0

如果机器无法联网,可以源码安装:

1) 依赖 python,可将python版本升级

2) 需要第三方包 meld3、setuptools、ElementTree

setuptools (latest) from .

meld3 (latest) from .

elementtree (latest) from .

3) root解压相关包,批量安装。

五配置

Supervisor 的配置文件命名为 supervisord.conf,它为
supervisord(Supervisor 的主服务命令) 和 supervisorctl(Supervisor
的监控管理命令) 提供配置选项设置。 Supervisor 并不规定配置文件
supervisord.conf 的存放位置,Supervisor 服务启动的时候默认会在:

  • $CWD/supervisord.conf
  • $CWD/etc/supervisord.conf
  • /etc/supervisord.conf

这几个目录位置查找配置文件 supervisord.conf。

Supervisor 也提供参数 “-c” 来指定配置文件的目录路径。
在终端输入 “echo_supervisord_conf” 命令可查看 Supervisor
的默认配置的内容。

生成一份默认的配置文件:

echo_supervisord_conf > /etc/supervisord.conf

supervisor配置比较简单,以下几个配置项满足基本的需求,更多配置项请参考官方配置说明

[supervisord]
nodeamon = false #以deamon方式启动进程

[supervisorctl] #使用系统默认配置项

[inet_http_server] #web管理页面的端口和用户密码
port = 8080

username = user

password = pwd

[rpcinterface:supervisor] #xml-rpc接口相关配置
supervisor.rpcinterface_factory =
supervisor.rpcinterface:make_main_rpcinterface

[program:mongodb]

command=/data1/mongodb_2.4.7_build/mongod -config
/data1/mongodbrs/config/mongodb.conf –directoryperdb –quiet –profile
1 –slowms 1000 –noprealloc –shardsvr

directory=/data1/mongodb_2.4.7_build

autostart=false

user=root

注意默认配置文件的最后几行

你可以在supervisord.conf文件相同目录下supervisord.d目录内添加.ini文件分开配置

[include]

files = supervisord.d/*.ini

注意:被监控的进程要以非daemon方式运行,以mongodb为例,需要去掉mongodb进程启动命令里的–fork
参数

六使用

#   启动supervisor

   python /usr/bin/supervisord

#  启动监控的进程

    supervisorctl start all

#  关闭监控的进程

      supervisorctl stop all

#  查看状态

      supervisorctl status

# 重新加载配置文件:

supervisorctl reload

其实,可以通过supervisorctl打开supervisor的命令行控制台,然后输入help可以查看看用的命令,然后help+命令可以查看每个命令的具体功能

web控制

在 supervisord.conf中配置[inet_http_server],

[inet_http_server]

port = 0.0.0.0:8080 #IP和绑定端口

username = admin #管理员名称

password = 123456 #管理员密码

这样,在浏览器中输入配置中写的地址和端口号,输入配置好的用户名和密码,便可以看到基于网页的控制台界面。从中,可以察看supervisor监控的>信息,可以察看进程的日志等。

浏览器访问:
图片 27

八、监控告警

如果需求只是自动拉起crash的进程,通过命令行对进程进行管理,以上内容足矣。supervisor
3.0版本引入了事件,利用这个特性我们实现实时监控进程状态并告警。

首先了解一下supervisor提供的事件,supervisor通过子进程对应用程序进行管理,监控程序同样作为一个子进程运行,子进程的stdin、stdout、stderr都已经被重定向。事件处理过程如下:

  • 作为监听程序的子进程向stdout写入READYn
  • 事件发生时,supervisor会选择一个处于Ready状态的子进程的stdin写入事件内容
  • 该子进程事件处理完毕后向stdout写入OKn或FAILn,反馈处理结果
  • 重复上述操作

supervisor提供的多种事件类型,包括:进程状态事件、supervisor状态事件、定时事件、xmlrpc调用事件、进程日志事件等等。我们主要关注进程状态相关事件。supervisor对进程定义了如下状态,每个状态的切换都会触发相应的事件。

图片 28

监控程序可以使用任何语言编写,只要按照supervisor的协议格式正确的处理事件消息即可。推荐使用python作为监控程序,supervisor提供了一个childutils模块使编写处理程序更简单。

九、延伸阅读

    
github上2个基于supervisor二次开发的集中进程管理工具,可在一个页面下管理多台机器的进程。

发表评论

电子邮件地址不会被公开。 必填项已用*标注