欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Linux自定义可运行shell脚本并设置开机自启

程序员文章站 2022-04-10 14:46:37
...

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 30chkconfig的第一个参数是指定脚本的运行等级,一般为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 startservice 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系统日志管理