Jamyy's Weblog

BASH: 利用 timeout 指令限制指令執行時間

by Jamyy on 七月.05, 2016, under Coding, Linux

目的: 撰寫 Sehll Script 將指定結束時間轉成秒數餵給 timeout 指令
應用實例: 利用晚上時間執行 rsync 指令複製資料, 若明天早上八點半還沒完成就中斷執行

認識 timeout 指令操作方式 (一)
$ timeout 5 sleep 3; echo $?

結果為 0, 因為三秒後 sleep 程序正常結束

認識 timeout 指令操作方式 (二)
$ timeout 3 sleep 5; echo $?

結果為 124, 因為三秒後 sleep 程序被中斷

撰寫 Shell Script
$ vi ~/go

#!/bin/bash

if [ $# -lt 2 ]; then
	echo "使用方式: $0 結束時間 執行指令"
	exit 1
fi

#將結束時間轉成 since 1970-01-01 00:00:00 的總秒數
TIMEOUT_s=$(date --date "$1" +%s)

#將現在時間轉成 since 1970-01-01 00:00:00 的總秒數
NOW_s=$(date +%s)

if [ $TIMEOUT_s -lt $NOW_s ]; then
	echo "結束時間必須大於現在時間。"
	exit 1
fi

#算出允許程序執行的總秒數
TOTAL_s=$((TIMEOUT_s-NOW_s))

#所有參數向左位移一位 (讓第一個參數消失不見)
shift

#執行 shift 後的所有參數, 若 $TOTAL_s 秒後仍未執行完畢則中斷程序
timeout $TOTAL_s $*

應用實例: 執行 rsync 指令複製資料, 若明天早上八點半還沒完成就中斷執行
$ bash ./go "tomorrow 8:30" rsync -a -v /path/* 192.168.1.1::backup/subdir/



Ref:



:,