Linux自定义可运行shell脚本并设置开机自启
Linux自定义可运行shell脚本并设置开机自启
自定义可运行shell脚本
创建文本文件vim test
,并输入如下文本
#!/bin/sh
# chkconfig:2345 60 30
# description:te
export JAVA_HOME=/usr/lib/jdk
export PATH=$JAVA_HOME/bin:$PATH
echo 开机启动了 > /home/startTest
脚本的前三行为固定格式
1、第一行#!/bin/sh
首先指明脚本的解释器(一定要在第一行,否则报错)
2、第二行# chkconfig:2345 60 30
,chkconfig
的第一个参数是指定脚本的运行等级,一般为2345即可,第二个参数是脚本的启动优先级(0-100),等级越高,优先级越低,也就启动越晚,第三个参数是关闭优先级,同理启动优先级。
3、脚本的描述信息
后面的代码即为需要执行的命令
通过service命令启动的是否,环境变量无法使用(暂时还不知道什么原因,有待查证),所以需要手动指定类似JAVA_HOME之类的环境变量。我发现这个原因是因为脚本通过sh test
运行的时候是没有问题的。但是通过service test start
就会报错failed to run command 'java': No such file or directory
。
编辑好shell脚本之后,赋予脚本可执行权限chmod 777 ./test
在系统init目录下建立脚本文件
这里有两种方式建立
1、直接将上一步创建的shell脚本copy到init目录下cp ./test /etc/init.d/
使用这种方式的话,如果需要修改shell脚本就需要到init目录下修改copy过来的文件
2、通过建立硬链接的方式,在init目录下建立一个shell脚本的硬链接ln ./test /etc/init.d/
注:
这里不可以建立软连接
软链接:
1.软链接,以路径的形式存在。类似于Windows操作系统中的快捷方式
2.软链接可以 跨文件系统 ,硬链接不可以
3.软链接可以对一个不存在的文件名进行链接
4.软链接可以对目录进行链接
硬链接:
1.硬链接,以文件副本的形式存在。但不占用实际空间。
2.不允许给目录创建硬链接
3.硬链接只有在同一个文件系统中才能创建
所以,如果建立软连接,系统是读取不到shell脚本的具体内容的
增加test服务
使用chkconfig命令将刚刚增加到init目录下的脚本添加成为一个新的服务chkconfig --add test
这时候查看服务列表即可发现多了test服务
[[email protected]_0_8_centos csdn]# chkconfig --list
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
[[email protected]_0_8_centos csdn]# chkconfig --add test
[[email protected]_0_8_centos csdn]# chkconfig --list
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:on 3:on 4:on 5:off 6:off
此时可以发现test服务的启动等级就是按照脚本中注明的启动等级# chkconfig:2345 60 30
来的,我们也可以通过命令修改(下面的chkconfig命令详解中有示例操作)。
其实这一步就相当于在系统的启动等级目录(/etc/rc0.d/
到/etc/rc6.d
)下创建了相应脚本的连接。
# 这里没有test服务
[[email protected]_0_8_centos csdn]# ll /etc/rc3.d/
total 0
lrwxrwxrwx. 1 root root 20 Apr 21 2016 K50netconsole -> ../init.d/netconsole
lrwxrwxrwx. 1 root root 17 Apr 21 2016 S10network -> ../init.d/network
而且连接的命名是有规则的,以S(系统在启动的时候,运行脚 本test2,就会添加一个start参数,告诉脚本,现在是启动模式)或K(系统在关闭系统的时候,会运行test2,添加一个stop,告诉脚本,现在是关闭模式)作为第一个字符。后面的数字为启动或关闭的优先级(0-100,也就是在脚本中注明的内容),后面就是脚本的名称。所以根据设置的运行等级和启动关闭的优先级不同,在相对应的启动等级目录中的连接名称也是分为两种。
完成自启
这个时候重启就可以实现服务自启了。
也可以通过service test start
或service test stop
来启动或停止服务。(但我没测试过,估计需要脚本接收start或stop参数完成不同操作。)
chkconfig命令详解
[[email protected]_0_8_centos csdn]# chkconfig --help
chkconfig version 1.3.61 - Copyright (C) 1997-2000 Red Hat, Inc.
This may be freely redistributed under the terms of the GNU Public License.
usage: chkconfig [--list] [--type <type>] [name] # 列出所有服务
chkconfig --add <name> # 增加一个服务
chkconfig --del <name> # 删除一个服务
chkconfig --override <name>
chkconfig [--level <levels>] [--type <type>] <name> <on|off|reset|resetpriorities> # 修改脚本的运行等级
# 示例
[[email protected]_0_8_centos csdn]# chkconfig --list
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:on 3:on 4:on 5:on 6:off
[[email protected]_0_8_centos csdn]# chkconfig --level 5 test off
[[email protected]_0_8_centos csdn]# chkconfig --list
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:on 3:on 4:on 5:off 6:off
查看服务启动日志
因为我们写的脚本有可能会有这种问题,所以查看启动日志还是很有必要的。
centos的系统日志在/var/log/messages
,直接vim即可。
我就是因为#!/bin/sh
没有放在脚本的第一行报的错,直接运行sh test
的时候是没有问题的,但是重启系统就是启动不起来,查看日志才发现问题。
关于Linux系统日志管理可以移步Linux系统日志管理。