Linux定時執行.sh指令碼

捲心菜的奇妙歷險發表於2022-01-28

 

因為測試ffmpeg推流用flv方式的話沒有做自動斷流,所以要先用.sh指令碼來執行關流,降低CPU和其他資源佔用

 

首先編寫.sh檔案

#! /bin/bash
echo "kill ffmpeg is start..."

killall -9 ffmpeg

echo "kill ffmpeg is ok!"

開頭是指此指令碼使用/bin/bash來解釋執行。

接下來是輸出執行開始,執行殺死指定名字的所有程式 ,然後輸出執行完成

將.sh檔案儲存為killffmpeg.sh並儲存在linux伺服器上,我這裡的路徑為/root/test/,注意,windows下儲存指令碼可能會有問題,因為:

Windows下換行符號是“\r\n”
回車符是Carriage Return, C語言中是'\r' 換行符是Line Feed, C語言中是'\n' 回車換行符實際是兩個字元, 就是\r\n;
而linux下是“\n”沒有”\r”;

執行以下命令

sed -i 's/\r$//' ./killffmpeg.sh

並且賦予.sh指令碼執行許可權,777是最高許可權,根據自己的需要來修改,可以使用ll ./檔名來檢視執行許可權

chmod 777 ./killffmpeg

 接下來我們嘗試執行已下已經編寫好的指令碼

可以看到,因為沒有正在拉推的流所以輸出了未找到程式,這是正常情況

但是我們光有指令碼還不行,我們需要定時任務執行器crontab

先檢查一下是否安裝了crontab

我安裝的作業系統是CentOS8.4所以使用systemctl ,有的朋友是service這樣,注意一下

systemctl status crond.service

可以看到CentOS8.4已經預安裝了cron,並且是enable狀態

如果沒有安裝的朋友可以參考這篇部落格

https://blog.csdn.net/hukai0q/article/details/83380951

可以使用yum來安裝

然後就可以配置任務了

修改 /etc/crontab 然後在最下面一行新增任務也可以,注意指令碼檔案的路徑是絕對路徑,可以用pwd命令來檢視

[root@localhost cron]# vi/etc/crontab

SHELL=/bin/bash

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

MAILTO=root

HOME=/

# run-parts

*/1 * * * * root /root/test/killffmpeg.sh

檔案/etc/crontab中每行任務的描述格式如下: 

 minute hour day month dayofweek command

 minute - 從0到59的整數

 hour - 從0到23的整數

 day - 從1到31的整數 (必須是指定月份的有效日期)

month - 從1到12的整數 (或如Jan或Feb簡寫的月份)

dayofweek - 從0到7的整數,0或7用來描述週日 (或用Sun或Mon簡寫來表示)

command - 需要執行的命令(可用as ls /proc >> /tmp/proc或 執行自定義指令碼的命令)

每一分鐘執行  */1 * * * *

每小時執行     0 * * * *

每天執行       0 0 * * *

每週執行       0 0 * * 0

每月執行       0 0 1 * *

每年執行       0 0 1 1 *

root表示以root使用者身份來執行

run-parts表示後面跟著的是一個資料夾,要執行的是該資料夾下的所有指令碼

對於以上各語句,星號(*)表示所有可用的值。例如*在指代month時表示每月執行(需要符合其他限制條件)該命令。

 整數間的連字號(-)表示整數列,例如1-4意思是整數1,2,3,4

指定數值由逗號分開。如:3,4,6,8表示這四個指定整數。

符號“/”指定步進設定。“/<interger>”表示步進值。如0-59/2定義每兩分鐘執行一次。步進值也可用星號表示。如*/3用來執行每三個月份執行指定任務。

以“#”開頭的為註釋行,不會被執行。

  • 星號(*) :代表所有可能的值,例如,month欄位如果是星號,則表示在滿足其它欄位的制約條件後,每月都執行該命令操作;

  • 逗號(,) :可以用逗號隔開的值,指定一個多元素的列表,例如:1,2,5,7,8,9

  • 中槓(-) :可以用整數之間的中槓表示一個整數範圍,例如“2-6”表示:2,3,4,5,6

  • 正斜線(/) :可以用正斜線指定時間的間隔頻率,例如“0-23/2”表示每兩小時執行一次。同時正斜線可以和星號一起使用,例如*/10,如果用在minute欄位,表示每十分鐘執行一次

crontab -l

如果報:no crontab for root

主要原因是由於這個liunx伺服器 第一次使用 crontab ,還沒有生成對應的檔案導致的,執行了 編輯(crontab -e)後就生成了這個檔案

crontab -e

直接編輯新增一行,注意這裡不需要加root,儲存退出即可

*/1 * * * * /root/test/killffmpeg.sh

crontab -e配置是針對某個使用者的,而編輯/etc/crontab是針對系統的任務
crontab -l //列出當前的所有排程任務 
crontab -l -u jp //列出使用者jp的所有排程任務
crontab -r //刪除所有任務排程工作

一般情況儲存退出後就已經存在任務列表了,可以使用crontab -l 來進行檢視,如果還沒有的話可以重新載入或者重啟crontab來重新整理任務列表

systemctl reload crond.service
systemctl restart crond.service

再次執行crontab -l 可以看到剛才新增的任務已經存在了

crontab的預設日誌路徑在/var/log/cron

我們使用命令檢視

tail -f /var/log/cron

 

可以看到,我們的定時任務已經成功執行並輸出了執行結果

 

至此,配置定時執行.sh指令碼完成

 

相關文章