linux可运行的shell脚本与设置开机服务启动(自己总结)

完整的ln命令参考:http://www.runoob.com/linux/linux-comm-ln.html

 ln :创建连接文件

        - 默认创建的是硬连接,好比复制 ,但是两个文件会同步

            命令:ln ./java/android/aa.txt  aaa

         - s :创建的是软连接变为指向(类似于windows的快捷方式)

 

 

软链接:

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

硬链接:

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

 

 

 

 

       

 

例如:

 

可运行文件:   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

 

2.创建一个软连接并运行

创建软连接     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]#

 

 

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

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

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

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

 

复制上面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

选项:
--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服务

 

 

------linux通过ln与chkconfig设置开机启动服务(第二个例子)-------------------------

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

第一步:

创建shell脚本:  test2

vim /etc/init.d/test2

 

编辑脚本内容如下:

#!/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)

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

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

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

 

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

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

 

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

 

 

 

 

第五步:删除服务

chkconfig --del test2

 

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

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

 

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

 

posted @ 2017-10-28 10:50  QiaoZhi  阅读(34120)  评论(0编辑  收藏  举报