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服務
[root@VM_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
[root@VM_0_8_centos csdn]# chkconfig --add test
[root@VM_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服務
[root@VM_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命令詳解
[root@VM_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> # 修改腳本的運行等級
# 示例
[root@VM_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
[root@VM_0_8_centos csdn]# chkconfig --level 5 test off
[root@VM_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系統日誌管理。