因為測試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指令碼完成