linux 開機自啓 假死自啓 (史上最全)


《SpringCloud Nginx 高併發核心編程》 環境搭建 - 系列

組件 連接地址
【必須】 虛擬機Linux 開發環境準備
Linux openresty 安裝 Linux openresty 安裝
【必須】Linux Redis 安裝(帶視頻) Linux Redis 安裝(帶視頻)
【必須】Linux Zookeeper 安裝(帶視頻) Linux Zookeeper 安裝, 帶視頻
Windows Redis 安裝(帶視頻) Windows Redis 安裝(帶視頻)
RabbitMQ 離線安裝(帶視頻) RabbitMQ 離線安裝(帶視頻)
ElasticSearch 安裝, 帶視頻 ElasticSearch 安裝, 帶視頻
Nacos 安裝(帶視頻) Nacos 安裝(帶視頻)
【必須】Eureka Eureka 入門,帶視頻
【必須】springcloud Config 入門,帶視頻 springcloud Config 入門,帶視頻
【必須】SpringCloud 腳手架打包與啓動 SpringCloud腳手架打包與啓動
Linux 自啓動 假死自啓動 定時自啓 Linux 自啓動 假死啓動

Linux 自啓動 假死自啓動

在linux的使用過程當中,咱們常常會碰到須要將某個自定義的應用程序設置爲開機自啓動以節省操做時間,這裏提供兩個設置開機自啓動的方法。面試

方法一:在 /etc/rc.local 添加開機自啓動程序

ubuntu在開機過程以後,會執行/etc/rc.local(注意/etc/init.d中也有個rc.local,不要弄混了)文件中的腳本程序,初始狀況下,這個文件內容是這樣的:spring

downey@ubuntu:~$ cat /etc/rc.local
#!/bin/sh -e
#
# rc.local
#
# This script is executed at the end of each multiuser runlevel.
# Make sure that the script will "exit 0" on success or any other
# value on error.
#
# In order to enable or disable this script just change the execution
# bits.
#
# By default this script does nothing.

並不包含其它內容,用戶能夠在裏面添加須要開機執行的腳本命令,這裏以diodon粘貼板工具爲例,若是我要開機運行diodon進程,在文本中添加:shell

downey@ubuntu:~$ cat /etc/rc.local
#!/bin/sh -e
#
# rc.local
#
# This script is executed at the end of each multiuser runlevel.
# Make sure that the script will "exit 0" on success or any other
# value on error.
#
# In order to enable or disable this script just change the execution
# bits.
#
# By default this script does nothing.
./usr/bin/diodon &
exit 0

看到這裏有些盆友就要問了,爲何要在執行命令後面加&?編程

在shell執行命令後加&是爲了讓應用程序在後臺運行,rc.local也是一個腳本,主進程在運行這個腳本時必須可以返回,若是在這個腳本里面執行了一些死循環或者其餘沒法返回的任務,整個系統就極可能卡死在這裏,沒法啓動,因此在這裏運行的用戶程序必須是可以返回或者自己就使用一些後臺運行的進程。ubuntu

通過上面的添加,在下次重啓的時候,使用命令:vim

downey@ubuntu:~$ ps -ef |grep "diodon"
downey     2097   1880  0 22:53 ?        00:00:04 diodon
downey     2937   2842  0 23:27 pts/2    00:00:00 grep --color=auto diodon

就能夠看到diodon進程已經在後臺運行。centos

刪除

既然有添加,就必須得有刪除,其實以rc.local的刪除方式很簡單,直接刪除rc.local中用戶添加的部分便可。

須要提醒的是,在操做系統文件時,作備份是很是必要的

方法二:在/etc/init.d/ 目錄下添加腳本

添加用戶進程

第二種方式就是將本身的用戶腳本添加到/etc/init.d並連接到自啓動程序當中。

仍是以diodon軟件來舉例,我編輯一個運行diodon的腳本:

#!/bin/bash
./usr/bin/diodon

將其命名爲diodon.sh,並用指令:

chmod +x diodon.sh
sudo cp diodon.sh /etc/init.d/

將文件放到/etc/init.d目錄中,而後將diodon,sh腳本連接到開機運行序列中:

cd /etc/init.d
sudo update-rc.d diodon.sh defaults 96
insserv: warning: script 'diodon' missing LSB tags and overrides

這樣從新啓動時,就能夠看到diodon.sh正在運行了。
sudo update-rc.d diodon.sh defaults 96
在這條指令中,update-rc.d是一個系統的連接工具。

defaults 96則是指定了腳本的開機順序,數字爲0-99,數字越大執行優先級越低,用戶添加的程序最好選擇低優先級的執行順序,由於極可能咱們的用戶程序會依賴一些系統的應用進程,例如若是應用程序要使用到網絡部分,就先得讓網絡後臺程序先初始化完畢。

看到這裏,細心的朋友已經發現了,在連接腳本時有一個警告:

insserv: warning: script 'diodon' missing LSB tags and overrides

做爲一個菜鳥而言,是不敢忽視任何警告的,因此只好求助google,解決辦法是在本身的腳本中的#!/bin/bash下添加:

### BEGIN INIT INFO
# Provides:          downey
# Required-Start:    $local_fs $network
# Required-Stop:     $local_fs
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: tomcat service
# Description:       tomcat service daemon
### END INIT INFO

添加這些的目的是告訴系統一些關於這個啓動腳本的具體信息,其中比較重要的有這幾項:

# Required-Start:   運行這個腳本須要的環境
# Required-Start:   中止這個腳本須要的環境
# Default-Start:    提供運行的運行級別
# Default-Stop:     不運行的運行級別
# Description:      描述

關於linux下的運行級別參考:linux運行級別

刪除用戶進程

既然有添加就必然有刪除,若是須要刪除自定義開機運行腳本,輸入:

sudo update-rc.d -f diodon remove

方法三:systemd的開機自啓動

上面提到的兩種方式適用於經典的system V控制系統啓動和關閉的狀況,可是目前(2018年10月)在大多數發行版上都開始使用了systemd的系統軟件控制方式,包括Ubuntu16,centos.systemd系統管理着linux下的進程運行,屬於應用程序,不屬於linux內核的範疇。

在systemd系統上設置開機自啓動的方式也是很是簡單的(儘管systemd這套軟件管理工具並不簡單)。

肯定系統是否應用了systemd工具來管理

這裏要注意的是,systemd是linux發行版上的預裝工具,用來管理系統軟件的啓動運行和結束,因此一般來講,這套東西是依賴於發行版的,若是系統使用了這一套工具,那麼就可使用它來管理進程,若是不是,即便你安裝了它,它也不會被默認配置爲系統管理工具。

查看系統是否使用systemd工具咱們可使用以下的指令:

systemd --version

若是系統返回以下相似的信息,代表該系統是由systemd工具來管理軟件:

systemd 232
+PAM +AUDIT +SELINUX +IMA +APPARMOR +SMACK +SYSVINIT +UTMP +LIBCRYPTSETUP +GCRYPT +GNUTLS +ACL +XZ +LZ4 +SECCOMP +BLKID +ELFUTILS +KMOD +IDN

systemctl的使用

對軟件的管理主要是同經過systemd工具中的systemctl命令,相比於以前的system V的控制方式,systemd顯得更加簡潔明瞭,對用戶更加友好,拿httpd來舉例:

開啓httpd服務:
sudo systemctl start httpd
設置httpd服務自啓動:
sudo systemctl enable httpd

至於關閉和取消自啓動,你們內心應該有數了吧。

設置systemctl的服務文件

咱們再回到重點,設置開機自啓動。

咱們要爲目標設置一個配置文件,其實這是能夠預想到的,linux做爲一個複雜的系統,開機自啓動涉及到的依賴、運行級別、運行環境等等問題確定須要用戶去指定,在啓動的時候系統才知道怎麼正確地去運行軟件。這個配置文件固定以.service做爲後綴,好比咱們若是要運行/home/downey目錄下的test.sh腳本,咱們能夠添加一個配置文件test.service:

[Unit]
Description=
Documentation=
After=network.target
Wants=
Requires=

[Service]
ExecStart=/home/downey/test.sh
ExecStop=
ExecReload=/home/downey/test.sh
Type=simple

[Install]
WantedBy=multi-user.target

將文件放在/usr/lib/systemd/system 或者 /etc/systemd/system目錄下,而後能夠測試一下:

sudo systemctl start test.service

而後你能夠查看你的/home/downey/test.sh腳本是否已經運行,若是已經運行表示配置文件沒有問題。而後能夠鍵入:

sudo systemctl enable test.service

設置test腳本開機啓動。若是上一步沒有出問題,這一步基本上也不會有什麼問題,系統會打印出以下信息:

Created symlink /etc/systemd/system/multi-user.target.wants/test.service → /usr/lib/systemd/system/test.service.

能夠看到,這裏在/etc/systemd/system/multi-user.target.wants/目錄下建立了一個/usr/lib/systemd/system/test.service文件的軟連接,到這裏設置開機自啓動就完成了。

systemctl配置文件的簡單解析

在上面的配置文件中,爲了演示起見,我將一些本測試腳本不須要可是比較重要的配置項也寫了出來,其實若是不須要能夠刪除,可是[Unit]/[Service]/[Install]這三個標籤須要保留。
咱們來一個個簡單介紹一下配置項:

Description:運行軟件描述
Documentation:軟件的文檔
After:由於軟件的啓動一般依賴於其餘軟件,這裏是指定在哪一個服務被啓動以後再啓動,設置優先級
Wants:弱依賴於某個服務,目標服務的運行狀態能夠影響到本軟件但不會決定本軟件運行狀態
Requires:強依賴某個服務,目標服務的狀態能夠決定本軟件運行。
ExecStart:執行命令
ExecStop:中止執行命令
ExecReload:重啓時的命令
Type:軟件運行方式,默認爲simple
WantedBy:這裏至關於設置軟件,選擇運行在linux的哪一個運行級別,只是在systemd中不在有運行級別概念,可是這裏權當這麼理解。

若是有多項,用逗號做爲分隔。

方法四:定時自重啓

定時監測與假死重啓的方式,使用crontab 定時任務監測進程,而且實時重啓。

準備 自動啓動腳本

舉個例子,

vi /usr/local/presto_monitor.sh

#!/bin/sh

command="/usr/local/Presto/presto-server-0.100/bin/launcher run"

appname=presto-server

logfile=/usr/local/log/presto_monitor.log

#返回 ps -ef 出來的全部字符串中含有 $appname 的進程個數

checkrun=`ps -ef | grep $appname | grep -v "grep" | wc -l` 

echo "$appname 運行監測開始….."

#ps -ef | grep launcher | grep -v "grep" | wc -l

 

#while true

#do

#echo $checkrun

if [ 0 = $checkrun ]; then

    #進程不存在

    time2=$(date "+%Y-%m-%d %H:%M:%S")

    echo "$appname 服務宕機,正在從新啓動"

  #echo "$appname 服務宕機,宕機時間爲:"$time2>>$appname.log

        #./$appname $appname &logfile

   nohup $command >  $logfile  2>&1 &

    #nohup  /usr/local/Presto/presto-server-0.100/bin/launcher run  >  presto_run.log  2>&1 &

sleep 1

 pid=$(ps -ef | grep -v 'grep' | egrep $appname| awk '{printf $2 " "}')   

 echo "$appname ($pid)從新啓動成功!!!"

else

  #進程存在
  sleep 1

pid=$(ps -ef | grep -v 'grep' | egrep $appname| awk '{printf $2 " "}')      

 echo "$appname ($pid) 服務運行正常...持續監控中"

fi

time=$(date "+%Y-%m-%d %H:%M:%S")

echo "本輪監測完畢,當前時間爲:"$time

#done

#這裏有一行

使用nohup命令後臺運行命令以後,須要使用exit正常退出當前帳戶,這樣才能保證命令一直在後臺運行(es head插件有這個問題)。

command>out.file是將command的輸出重定向到out.file文件,即輸出內容不打印到屏幕上,而是輸出到out.file文件中。若是不想要輸出文件則修改 out.file 爲 /dev/null。

2>&1 是將標準出錯重定向到標準輸出,這裏的標準輸出已經重定向到了out.file文件,即將標準出錯也輸出到out.file文件中。

最後一個&, 是讓該命令在後臺執行。

0-輸入 1-輸出 2-錯誤

crontab 定時任務

crontab:定時任務的守護進程,精確到分,設計秒的咱們通常寫腳本 -->至關於鬧鐘

​ 日誌文件: ll /var/log/cron*

​ 編輯文件: vim /etc/crontab

​ 進程:ps -ef | grep crond ==> /etc/init.d/crond restart

​ 做用:定時備份,實時備份

Linux下的任務調度分爲兩類,系統任務調度和用戶任務調度。

(1) 系統任務調度:系統週期性所要執行的工做,好比寫緩存數據到硬盤、日誌清理等。

​ 在/etc/crontab文件,這個就是系統任務調度的配置文件。

(2) 用戶任務調度:用戶按期要執行的工做,好比用戶數據備份、定時郵件提醒等。

​ 用戶可使用 crontab 工具來定製本身的計劃任務。

​ 在crontab 文件都被保存在/var/spool/cron目錄中。其文件名與用戶名一致

1.系統定時任務:例如清理系統日誌,清理系統緩存 -->不過多的關注

​ 查詢系統定時處理任務的路徑:

​ 路徑1:

​ cd /etc/logrotate.d/ -->能夠寫定時任務

​ less syslog

​ 路徑2:

​ cat /etc/crontab -->不推薦使用,可是能夠看格式

​ 路徑3:

​ ls /etc/ | grep cron*

​ anacrontab

​ cron.d -->同路徑2 ,能夠寫定時任務

​ cron.daily

​ cron.deny -->控制普通用戶使用定時任務crontab

​ cron.hourly

​ cron.monthly

​ crontab

​ cron.weekly

2.用戶的定時任務 -->關注重點

查看自動執行命令

/etc/crontab -l

若是沒有權限,

sudo groupadd root:crontab

sudo chown root:crontab /var/spool/cron/crontabs/

啓動 crond

service crond start

*/10 * * * *

cron 的主配置文件是 /etc/crontab,它包括下面幾行:

SHELL=/bin/bash

PATH=/sbin:/bin:/usr/sbin:/usr/bin

MAILTO=root

 

# For details see man 4 crontabs


# Example of job definition:
# .---------------- minute (0 - 59)
# |  .------------- hour (0 - 23)
# |  |  .---------- day of month (1 - 31)
# |  |  |  .------- month (1 - 12) OR jan,feb,mar,apr ...
# |  |  |  |  .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# |  |  |  |  |
# *  *  *  *  * user-name  command to be executed

前四行是用來配置 cron 任務運行環境的變量。 SHELL 變量的值告訴系統要使用哪一個 shell 環境(在這個例子裏是 bash shell);

PATH 變量定義用來執行命令的路徑。

cron 任務的輸出被郵寄給 MAILTO 變量定義的用戶名。

若是 MAILTO 變量被定義爲空白字符串(MAILTO=""),電子郵件就不會被寄出。

HOME 變量能夠用來設置在執行命令或腳本時使用的主目錄。

/etc/cron.allow和/etc/cron.deny 文件被用來限制對 cron 的使用。

這兩個使用控制文件的格式都是每行一個用戶。 兩個文件都不容許空格。

若是使用控制文件被修改了,cron 守護進程(crond)沒必要被重啓。

使用控制文件在每次用戶添加或刪除一項 cron 任務時都會被讀取。

不管使用控制文件中的規定如何,root 都老是可使用 cron。

若是 cron.allow 文件存在,只有其中列出的用戶才被容許使用 cron,而且 cron.deny 文件會被忽略。

若是 cron.allow 文件不存在,全部在 cron.deny 中列出的用戶都被禁止使用 cron。

crontab 經常使用命令

安裝crontab:

yum install crontabs

crontab服務操做說明:

/sbin/service crond start //啓動服務

/sbin/service crond stop //關閉服務

/sbin/service crond restart //重啓服務

/sbin/service crond reload //從新載入配置

查看crontab服務狀態:

service crond status

手動啓動crontab服務:

service crond status

查看crontab服務是否已設置爲開機啓動,執行命令:

方法一: 界面啓動 ntsysv

方法二: 加入開機自動啓動: chkconfig –level 35 crond on

crontab -l查看定時任務列表

編輯定時任務

crontab –e

==》vim /var/spool/cron/root

每隔2分鐘輸出時間到文件

*/2 * * * * echo date >> $HOME>test.txt

crontab -r 刪除定時任務

==> 從/var/spool/cron目錄中刪除用戶的crontab文件

==> 若是不指定用戶,則默認刪除當前用戶的crontab文件

crontab –i 在刪除用戶的crontab文件時給確認提示

備份crontab文件

crontab -l > $HOME/mycron

系統級任務調度與用戶級任務調度

root用戶的任務調度操做能夠經過「crontab –uroot –e」來設置,也能夠將調度任務直接寫入/etc/crontab文件,須要注意的是,若是要定義一個定時重啓系統的任務,就必須將任務放到/etc/crontab文件,即便在root用戶下建立一個定時重啓系統的任務也是無效的。

其餘注意事項

當crontab忽然失效時,能夠嘗試/etc/init.d/crond restart解決問題。或者查看日誌看某個job有沒有執行/報錯tail -f /var/log/cron。

千萬別亂運行crontab -r。它從Crontab目錄(/var/spool/cron)中刪除用戶的Crontab文件。刪除了該用戶的全部crontab都沒了。

在crontab中%是有特殊含義的,表示換行的意思。若是要用的話必須進行轉義%,如常常用的date ‘+%Y%m%d’在crontab裏是不會執行的,應該換成date ‘+%Y%m%d’

最後.crontab箴言

1.環境變量問題,例如crontab不能識別Java的環境變量

​ crontab執行shell時,只能識別爲數很少的環境變量,普通的環境變量是沒法識別的,因此在編寫shell時,最好使用export從新聲明變量,確保腳本執行。

2.命令的執行最好用腳本

3.腳本權限加/bin/sh,規範路徑/server/scripts

4.時間變量用反斜線轉義,最好用腳本

5.定時任務添加註釋

6.>/dev/null 2>&1 ==> &>/dev/null,別隨意打印日誌文件

7.定時任務裏面的程序腳本儘可能用全路徑

8.避免沒必要要的程序以及命令輸出

9.定時任務以前添加註釋

10.打包到文件目錄的上一級

crontab內容格式

​ 用戶所創建的crontab文件中,每一行都表明一項任務,每行的每一個字段表明一項設置,它的格式共分爲六個字段,前五段是時間設定段,第六段是要執行的命令段,格式以下:

​ minute hour day month week command

其中:

一、minute: 表示分鐘,能夠是從0到59之間的任何整數;
二、hour:表示小時,能夠是從0到23之間的任何整數;
三、day:表示日期,能夠是從1到31之間的任何整數;
四、month:表示月份,能夠是從1到12之間的任何整數;
五、week:表示星期幾,能夠是從0到6之間的任何整數,這裏的0表明星期日;
六、command:要執行的命令,能夠是系統命令,也能夠是本身編寫的腳本文件。

前五個時間設定段,能夠含以下特殊字符:

​ 一、星號(*):表明全部可能的值,例如month字段若是是星號,則表示在知足其它字段的制約條件後每個月都執行該命令操做;

​ 二、逗號(,):能夠用逗號隔開的值指定一個列表範圍,例如,「1,2,5,7,8,9」;

​ 三、中槓(-):能夠用整數之間的中槓表示一個整數範圍,例如「2-6」表示「2,3,4,5,6」;

​ 四、正斜線(/):能夠用正斜線指定時間的間隔頻率,例如「0-23/2」表示每兩小時執行一次。同時正斜線能夠和星號一塊兒使用,例如*/10,若是用在minute字段,表示每十分鐘執行一次。

crontab 查看日誌

一.文件位置

位置通常在/var/spool/cron/下,若是你是root用戶,那下面有個root文件,建議平常備份,避免誤刪除致使crontab 文件丟失;

二.日誌文件位置

默認狀況下,crontab中執行的日誌寫在/var/log下,如:

#ls /var/log/cron*

/var/log/cron /var/log/cron.1 /var/log/cron.2 /var/log/cron.3 /var/log/cron.4

crontab的日誌比較簡單,當crond執行任務失敗時會給用戶發一封郵件。恰巧在咱們的一臺服務器上發現一個任務沒有正常執行,並且crond發郵件也失敗了。經過看mail的日誌,看到是磁盤空間不足形成的。

能夠將每條 crontab中的任務增長本身的日誌,有利於查找執行失敗緣由。

0 6 * * * //root/script/ss.sh >> /root/for_crontab/mylog.log 2>&1

把錯誤輸出和標準輸出都輸出到mylog.log中。

回到◀瘋狂創客圈

瘋狂創客圈 - Java高併發研習社羣,爲你們開啓大廠之門

相關文章
相關標籤/搜索