shell脚本编写自动启动服务方法

前言

ln :创建连接文件

  • 默认创建的是硬连接,好比复制 ,但是两个文件会同步
    命令:ln ./java/android/aa.txt aaa
  • s :创建的是软连接变为指向(类似于windows的快捷方式:In -s

软链接:

1.软链接,以路径的形式存在。类似于Windows操作系统中的快捷方式
2.软链接可以 跨文件系统 ,硬链接不可以
3.软链接可以对一个不存在的文件名进行链接
4.软链接可以对目录进行链接

硬链接:

1.硬链接,以文件副本的形式存在。但不占用实际空间。
2.不允许给目录创建硬链接
3.硬链接只有在同一个文件系统中才能创建

脚本模板

#!/bin/bash
# The next lines are for chkconfig on RedHat systems.
# chkconfig: 35 98 02
# description: Starts and stops xxx Server # The next lines are for chkconfig on SuSE systems.
# /etc/init.d/xxx
#
### BEGIN INIT INFO
# Provides: xxx
# Required-Start: $network $syslog
# Required-Stop:
# Default-Start: 2 3 5
# Default-Stop: 0 6
# Short-Description: Starts and stops xxx Server
# Description: Starts and stops xxx Server
### END INIT INFO case $1 in
start) # 服务启动需要做的步骤
...
;;
stop) # 服务停止需要做的步骤
...
;;
restart) # 重启服务需要做的步骤
...
;;
status) # 查看状态需要做的步骤
...
;;
*) echo "$0 {start|stop|restart|status}"
exit 4
;;
esac

参考示例,其实写一个服务脚本很简单,只要满足参数1为start|stop|restart|status的脚本都可以,注意上面以#开头的那些行,分别满足redhat和suse的要求,按照格式写就行了
写完后用chkconfig 服务名 on即可加入开机自启动服务

例如:可运行文件: qq.sh 内容如下

num=3
#!/bin/bash
case $num in
1)
echo "num=1";;
2)
echo "num=2";;
3)
echo "num=3";;
4)
echo "num=4";;
*)
echo "defaul";;
esac

赋予可运行权限:
chmod +x qq.sh
注意:运行sh文件的方式
  第一种:   ./qq.sh      需要加./
  第二种 sh qq.sh     不需要加./

一创建硬链接并运行

1.创建一个目录ww,并在ww目录创建一个可运行文件qq.sh的硬连接并运行:

[rwwwt@iz2ze46xi6pjjj ~]# mkdir ww
[rwwwt@iz2ze46xi6pjjj ~]# cd ww
[rwwwt@iz2ze46xi6pjjj ww]# ls
[rwwwt@iz2ze46xi6pjjj ww]# ln ../qq.sh qq
[rwwwt@iz2ze46xi6pjjj ww]# ls
qq
[rwwwt@iz2ze46xi6pjjj69ailg9lz ww]# ./qq
num=3

二创建一个软连接并运行

创建软连接 ln -s ../qq.sh qq.sh.link
运行软连接   ./qq.sh.link

[rwwwt@iz2ze46xi6pjjj ~]# mkdir ww
[rwwwt@iz2ze46xi6pjjj ~]# cd ww
[rwwwt@iz2ze46xi6pjjj ww]# ls
[rwwwt@iz2ze46xi6pjjj ww]# ln -s ../qq.sh qq.sh.link
[rwwwt@iz2ze46xi6pjjj ww]# ls -l
total 0
lrwxrwxrwx 1 root root 8 Oct 28 10:41 qq.sh.link -> ../qq.sh
[rwwwt@iz2ze46xi6pjjj ww]# ./qq.sh.link
num=3
[rwwwt@iz2ze46xi6pjjj ww]#

三. 将上面qq.sh进行改造后可提取输入参数:

bash shell可根据参数位置获取参数。通过 $1 到 $9 获取第1到第9个的命令行参数。$0为shell名。如果参数超过9个,那么就只能通过${}来获取了, 例如获取第10个参数,那么可以写为${10}。

num=$1
#!/bin/bash
case $num in
1)
echo "num=1";;
2)
echo "num=2";;
3)
echo "num=3";;
4)
echo "num=4";;
*)
echo "defaul";;
esac

运行原来的qq.sh

[rwwwt@iz2ze46xi6pjjj ww]# ./qq.sh  4
num=4

运行软连接

[rwwwt@iz2ze46xi6pjjj ww]# ./qq.sh.link  2
num=2

____linux通过ln与chkconfig设置开机启动(第一个例子)____

第一步:我们在/etc/init.d或者/etc/rc.d/init.d下新建一个文件test(需要在root权限下操作)(/etc/init.d是/etc/rc.d/init.d的一个软连接)

[rwwwt@iz2ze46xi6pjjj ww]# vim /etc/init.d/test //在init.d目录下创建文件,输入模式

复制上面的qq.sh文件内容粘贴进来

#!/bin/bash
num=$1
case $num in
1)
echo "num=1";;
2)
echo "num=2";;
3)
echo "num=3";;
4)
echo "num=4";;
*)
echo "defaul";;
esac

第二步:保存退出之后,给其增加可执行权限

[rwwwt@iz2ze46xi6pjjj ww]# chmod +x  /etc/init.d/test //保存

第三步:挂载(创建一个软连接)

将 这个shell文件的link连到/etc/rc2.d/目录下。linux的/etc/rcX.d/目录中的数字代表开机启动时不同的run level,也就是启动的顺序,Ubuntu9.10下有0-5六个level,不能随便连到其他目录下,可能在那个目录中的程序启动时Tomcat所需 要的一些库尚未被加载,用ln命令将tomcat的链接链过去:sudo ln -s /etc/init.d/tomcat /etc/rc2.d/S16Tomcat。rcX.d目录下的命名规则是很有讲究的,更具不同需要可能是S开头,也可能是K开头,之后的数字代表他们的 启动顺序,详细看各自目录下的Readme文件。

[rwwwt@iz2ze46xi6pjjj ww]# ln -s /etc/init.d/test /etc/rc2.d/S17Test

第四步:设置脚本开机自启动

把这个脚本设置成系统启动时自动执行,系统关闭时自动停止,使用如下命令:

[rwwwt@iz2ze46xi6pjjj ww]# chkconfig --add test

第五步:验证:chkconfig命令:

参考:http://www.cnblogs.com/qlqwjy/p/7746419.html

chkconfig 选项 说明
--level levels 指定一个运行级别适合的操作。范围为0-7。
--add name 增加一个新的服务。
--del name 删除一个服务
--list name 显示服务的情况

查看全部服务:

[rwwwt@iz2ze46xi6pjjj ww]# chkconfig --list  //输入查看全部命令 显示如下
Note: This output shows SysV services only and does not include native
systemd services. SysV configuration data might be overridden by nat
systemd configuration.
If you want to list systemd services use 'systemctl list-unit-files'
To see services enabled on particular target use
'systemctl list-dependencies [target]'.
aegis 0:off 1:off 2:on 3:on 4:on 5:on 6:off
agentwatch 0:off 1:off 2:on 3:on 4:on 5:on 6:off
cloudmonitor 0:off 1:off 2:on 3:on 4:on 5:on 6:off
netconsole 0:off 1:off 2:off 3:off 4:off 5:off 6:off
network 0:off 1:off 2:on 3:on 4:on 5:on 6:off
test 0:off 1:off 2:off 3:on 4:on 5:on 6:off
tomcat 0:off 1:off 2:off 3:on 4:on 5:on 6:off

启动test服务

[rwwwt@iz2ze46xiz ~]# service test
num=3
[rwwwt@iz2ze46xi6pjjj69ailg9lz ~]# service test start
num=3

删除test服务:

[rwwwt@iz2ze46xiz ~]# chkconfig --del test

删除后再次查看发现不存在service服务

----------------------------设置开机启动服务(第二个例子)------------------------

参考:http://www.cnblogs.com/qlqwjy/p/7746419.html

第一步:

创建shell脚本: test2

vim /etc/init.d/test2</pre>

编辑脚本内容如下:

#!/bin/sh
#chkconfig: 2345 80 90
#description:test2
case "$1" in
start) echo "start test2 service";;
stop) echo "stop test2 service";;
esac

** 第二步:**

赋予运行权限:

chmod +x /etc/init.d/test2

测试脚本:

/etc/init.d/test2 start
start test2 service

也可以:(service自动寻找/etc/init.d目录下)

service test2 start
start test2 service

解析:service是一个shell脚本,service test2 相当于 /etc/init.d/test2 start

****第三步:(两种方式:手动添加服务+chkconfig创建服务 原理都是创建软连接)****

1.chkconfig创建服务

chkconfig --add test2

脚本的前三行如下:(脚本前面三行格式固定)

#!/bin/sh
#chkconfig: 2345 80 90
#description:test2

第一行,告诉系统使用的shell,所有的shell脚本都是这样。
第 二行,chkconfig后面有三个参数2345,80和90告诉chkconfig程序,需要在rc2.d~rc5.d目录下,创建名字为 S80test2的文件连接,连接到/etc/rc.d/init.d目录下的的test2脚本。第一个字符是S,系统在启动的时候,运行脚 本test2,就会添加一个start参数,告诉脚本,现在是启动模式。同时在rc0.d和rc6.d目录下,创建名字为K90test2的 文件连接,第一个字符为K,系统在关闭系统的时候,会运行test2,添加一个stop,告诉脚本,现在是关闭模式。
注意上面的三行中,第二,第三行是必须的,否则在运行chkconfig --add test2时,会报错。

查看 /etc/rc2.d目录下结构:(S80test2)****

 
image.png

S:代表启动服务(运行脚本传入start参数)

K:关闭服务(运行脚本传入stop参数)

80; 运行级别,越小越优先运行,优先级相同的时候按创建时间启动。

查看 /etc/rc3.d目录下结构:(S80test2)

 
image.png

查看 /etc/rc0.d目录下结构:(K90test2)

 
image.png

2.手动添加服务:

在rc0.d-rc6.d目录下分别创建文件连接。

ln -s /etc/rc.d/init.d/test2 /etc/rc.d/rc2.d/S99test2
ln -s /etc/rc.d/init.d/test2 /etc/rc.d/rc3.d/S99test2
ln -s /etc/rc.d/init.d/test2 /etc/rc.d/rc5.d/S99test2
ln -s /etc/rc.d/init.d/test2 /etc/rc.d/rc0.d/K01test2
ln -s /etc/rc.d/init.d/test2 /etc/rc.d/rc6.d/K01test2

Tips:/etc/rc[0~6].d其实是/etc/rc.d/rc[0~6].d的软连接,主要是为了保持和Unix的兼容性才做此策
   /etc/init.d/其实是/etc/rc.d/init.d/的软连接。

第四步:验证

chkconfig --list
 
image.png

第五步:删除服务

chkconfig --del test2

上述删除服务的命令会删除/etc/rc.d/rc[0-6].d下面的软连接。

查看/etc/rc.d/rc3.d目录:(test2的软连接已删除)

 
image.png

查看/etc/init.d目录结构:(原来test2文件仍然存在)

 
image.png

shell脚本编写自动启动服务方法的更多相关文章

  1. shell脚本编写方法

    shell脚本编写就如同一门语言,涉及到运行环境.基本语法.变量定义.函数.参数(系统参数).条件判定.执行流程控制 等等问题. 本文就以下几个方面进行描述: 运行环境: shell  shebang ...

  2. 7. Shell 脚本编写

    一.Shell 脚本编写 1.提示用户输入一个字符串,如果是 hello,打出 yes,并每秒输出 "hello,world",否则就输出 no,实现如下: #!/bin/bash ...

  3. Shell awk文本处理,shell脚本编写

    Shell awk文本处理,shell脚本编写 一:内容包含awk.变量.运算符.if多分支 <a>语法糖: awk [options] 'commands' files option - ...

  4. shell脚本编写mind

    首先我们要缩小这个问题的范围 如果在面试中被问到这样的问题,说说shell脚本编写思路 如:你是在公司主要负责zabbix监控的 对答如下:shell脚本这个说法挺广的,您看我这么跟您说吧,我在平时工 ...

  5. linux c程序中获取shell脚本输出的实现方法

    linux c程序中获取shell脚本输出的实现方法 1. 前言Unix界有一句名言:“一行shell脚本胜过万行C程序”,虽然这句话有些夸张,但不可否认的是,借助脚本确实能够极大的简化一些编程工作. ...

  6. 执行shell脚本的几种方法及区别

    执行shell脚本的几种方法及区别 http://blog.csdn.net/lanxinju/article/details/6032368 (认真看) 注意:如果涉及到脚本之间的调用一定要用 . ...

  7. 第三部分shell编程3(shell脚本编写1)

    做监控和备份最多 1. shell脚本是什么它是一种脚本语言,并非编程语言可以使用一些逻辑判断.循环等语法可以自定义子函数是系统命令的集合shell脚本可以实现自动化运维,大大增加我们的工作效率 第一 ...

  8. 基于数组的shell脚本编写

    基于数组的shell脚本编写 2017年08月17日 22:56:36 momokuku123 阅读数:369 数据:变量,文件,数组 变量:存储单个元素的内存中的一块存储空间 数组:存储多个元素的内 ...

  9. shell脚本编写nginx部署脚本

    下面为shell脚本编写的nginx的安装及修改nginx.conf的脚本,脚本比较简单: #!/bin/bash function yum_install(){ yum install epel-r ...

随机推荐

  1. java-异常-自定义异常异常类的抛出throws

    1 package p1.exception; 2 /* 3 * 对于角标是整数不存在,可以用角标越界表示, 4 * 对于负数为角标的情况,准备用负数角标异常来表示. 5 * 6 * 负数角标这种异常 ...

  2. Arduino+ESP32 之 SD卡读写

    背景知识: ESP32有两种使用SD卡的方法,一种是使用SPI接口访问SD卡,另一种是使用SDMMC接口访问SD卡 . Arduino core for the ESP32中SPI方式占用4个IO口, ...

  3. 微服务架构 | 7.1 基于 OAuth2 的安全认证

    目录 前言 1. OAuth2 基础知识 1.1 安全性的 4 个组成部分 1.2 OAuth2 的工作原理 1.3 OAuth2 规范的 4 种类型的授权 1.4 OAuth2 的优势 1.5 OA ...

  4. 守护石谈学习Java之路

    ​这次在CSDN Blink发表了几篇关于Java编程学习的小作文,讲述了Java工程师的成长路线.Java学习的技能树和入门工作要关注的核心问题,我继续做一次文章的整合与延展,以文章的形式发表出来, ...

  5. 【然天一】随机读写(4k)百盘天梯

    随机读写适用于大量小文件的读写,是最贴近办公和编程的使用场景.现在很多硬盘厂商只宣传它们的连续读写(Seq),但除了游戏和视频剪辑场景之外并没有什么卵用. 总结一下: 傲腾秒杀全部 NAND SLC ...

  6. 看一遍就懂:MVCC原理详解

    MVCC实现原理也是一道非常高频的面试题,自己在整理这篇文章的时候,感觉到网上的资料在讲这块知识点上写的五花八门,好像大家的理解并没有一致. 这里将自己所理解的做一个总结,个人会觉得这是一篇含金量挺高 ...

  7. Network Kit与三七游戏共创流畅游戏体验,无惧网络延迟

    本文分享于HMS Core联盟论坛<[开发者说]无惧高网络吞吐量,HMS Core Network Kit与三七游戏共创流畅游戏体验>的采访整理. 三七游戏拥有<斗罗大陆·魂师对决& ...

  8. 什么是Segue

    Storyboard上每一根用来界面跳转的线,都是一个UIStoryboardSegue对象(简称Segue) Segue的属性 每一个Segue对象,都有3个属性唯一标识@property (non ...

  9. java多线程编程(一)

    一.概念基础 进程:正在进行中的程序(直译). 线程:就是进程中一个负责程序执行的控制单元(执行路径) 一个进程中可以多执行路径,称之为多线程. 一个进程中至少要有一个线程. 开启多个线程是为了同时运 ...

  10. c++ 堆栈和内存管理

    stack(栈),heap(堆) Stack:是存在于某作用域(scope)的一个内存空间(memory space).例如当你调用函数,函数本身即会形成一个stack用来放置它所接收的参数,返回地址 ...