在 Linux 中使用 timeout 命令為正在運(yùn)行的命令設(shè)置計(jì)時(shí)器
使用 timeout 命令,可以為運(yùn)行的程序或命令設(shè)置超時(shí)時(shí)間,當(dāng)程序或命令運(yùn)行的時(shí)間超過設(shè)置值時(shí),就會被 timeout 強(qiáng)行終止。
今天我們分享一下如何使用 timeout 命令。
如何使用 timeout 命令
timeout 命令的使用語法如下所示:
在上述語法描述中,時(shí)間的單位為秒(second)。
我們以 sleep 命令為例。sleep 命令會讓系統(tǒng)休眠指定的時(shí)間,比如 sleep 10,系統(tǒng)會休眠 10 秒鐘(即當(dāng)前 shell 會等待 10 秒鐘)。但是如果我使用了 timeout 命令,如下所示:
上述命令中,sleep 命令指定的 10 秒鐘,即原計(jì)劃讓 shell 等待 10 秒鐘,但是前面添加了 timeout 命令,設(shè)置超時(shí)時(shí)間為 4 秒鐘,所以最終結(jié)果是在 4 秒鐘后 sleep 命令被終止,shell 被重新喚醒。
默認(rèn)情況下,timeout 命令會發(fā)送 SIGTERM 信號柔和的終止正在運(yùn)行的程序。但是我們可以使用 -s 選項(xiàng)來使用其他信號。
大家可以使用 kill -l 命令來查看 Linux 中的 kill 信號。假如我們想要發(fā)送 SIGKILL 信號(kill -9),而不是默認(rèn)的 SIGTERM,可參考如下命令:
此外,我們也可以使用 KILL 或 9(kill -l 中列出的 SIGKILL 的數(shù)字)來代替 SIGKILL。
強(qiáng)制殺掉進(jìn)程有可能會造成數(shù)據(jù)丟失,不過程序確實(shí)可以忽略 SIGTERM。
另外一種更好的處理方式是,假如你發(fā)送的終止請求被正在運(yùn)行的(想要終止的)程序給忽略了,那么這時(shí)候可以發(fā)送強(qiáng)制終止信號。
我們來看這樣一個(gè)例子:假設(shè)我們想運(yùn)行一個(gè)時(shí)間不超過 5 秒的程序,但是當(dāng)程序運(yùn)行以后(因某種原因)無法終止,那么我們可以在發(fā)送默認(rèn)的 SIGTERM 信號 3 秒鐘后再發(fā)送一個(gè)強(qiáng)制終止的信號。如下命令所示:
這也就意味著,我們所運(yùn)行的那個(gè)程序,運(yùn)行時(shí)間不會超過 8 秒鐘??梢允褂?time 命令來檢查程序?qū)嶋H的運(yùn)行時(shí)間。
那么,timeout 命令的實(shí)際應(yīng)用場景是什么呢?
timeout 命令看起來跟其他一些不怎么常用的命令一樣,使用的時(shí)候比較少。然而,在某些特殊情況下,它還是很有用的。
比如在進(jìn)行網(wǎng)絡(luò)操作的時(shí)候可以使用 timeout 來設(shè)置超時(shí)時(shí)間,或者當(dāng)你在玩一個(gè)終端游戲的時(shí)候,為了防止沉迷于游戲(玩的時(shí)間過長),也可以使用 timeout 命令來讓游戲程序在某個(gè)時(shí)間后強(qiáng)行終止運(yùn)行。