如何在linux上使用timeout命令

好的,這足夠用電腦了。您可以給程序時間限制,透過timeoutcommand設定它們可以執行的最長時間。這裡有一個教程來限制用這個命令執行程式。...

好的,這足夠用電腦了。您可以給程序時間限制,透過timeoutcommand設定它們可以執行的最長時間。這裡有一個教程來限制用這個命令執行程式。

超時對你有什麼好處?

timeout命令允許您設定程式執行的時間長度限制。但你為什麼要這麼做?

一種情況是,您確切地知道一個程序要執行多長時間。一個常見的使用案例是對日誌或資料捕獲程式進行超時控制,這樣日誌檔案就不會無情地佔用硬碟空間。

另一種情況是,您不知道一個程序要執行多長時間,但是您知道您不希望它無限期地執行。您可能有這樣一個習慣:設定正在執行的程序,最小化終端視窗,然後忘記它們。

有些程式-即使是簡單的實用程式也會生成網路流量,其級別會影響網路效能。或者它們會佔用目標裝置上的資源,降低其效能。(平,我看著你。)當你離開電腦時,讓這些程式長時間執行是不好的做法。

超時是GNU核心Utils的一部分,因此Linux和類似Unix的作業系統(如macOS)都內建了超時。沒有什麼可安裝的,你可以直接使用它。

超時入門

下面是一個簡單的例子。例如,使用預設的命令列選項,ping命令將一直執行,直到您按Ctrl+C停止它為止。如果您不中斷它,它將繼續執行。

ping 192.168.4.28

如何在linux上使用timeout命令

透過使用timeout,我們可以確保ping不會不停地執行,佔用網路頻寬並糾纏正在ping的任何裝置。

下一個命令使用超時時間限制ping。我們給ping留出15秒的執行時間。

timeout 15 ping 192.168.4.28

如何在linux上使用timeout命令

15秒後,超時終止ping會話,返回命令列提示符。

如何在linux上使用timeout命令

與其他時間單位一起使用超時

請注意,我們不必在15後面新增“s”。超時假定值以秒為單位。你可以加一個“s”,但其實沒什麼區別。

要使用以分鐘、小時或天為單位的時間值,請新增“m”、“h”或“d”

要使ping執行三分鐘,請使用以下命令:

timeout 3m ping 192.168.4.28

如何在linux上使用timeout命令

ping將執行三分鐘,然後超時進入並停止ping會話。

如何在linux上使用timeout命令

使用超時限制資料捕獲

一些資料捕獲檔案可能會迅速變大。為了防止這些檔案變得笨拙甚至大小有問題,請限制捕獲程式允許執行的時間。

在這個例子中,我們使用tcpdump,一個網路流量捕獲工具。在本文研究的測試機器上,tcpdump已經安裝在ubuntulinux和fedoralinux中。它必須透過以下命令安裝在Manjaro Linux和Arch Linux上:

sudo pacman -Syu tcpdump

如何在linux上使用timeout命令

我們可以使用tcpdump的預設選項執行10秒,並將其輸出重定向到一個名為捕獲.txt使用以下命令:

timeout 10 sudo tcpdump > capture.txt

如何在linux上使用timeout命令

(tcpdump有自己的選項將捕獲的網路流量儲存到檔案中。這是一個快速的攻擊,因為我們討論的是超時,而不是tcpdump。)

tcpdump開始捕獲網路流量,我們等待10秒。10秒來來去去,tcpdump仍在執行捕獲.txt規模仍在增長。要停止tcpdump需要一個快速的Ctrl+C。

正在檢查捕獲.txtls顯示它在幾秒鐘內增長到209K。那個檔案增長很快!

ls -lh capture.txt

如何在linux上使用timeout命令

發生什麼事了?為什麼超時不停止tcpdump?

這都和訊號有關。

發出正確的訊號

當timeout想要停止一個程式時,它傳送SIGTERM訊號。這會禮貌地要求程式終止。有些程式可能會選擇忽略SIGTERM訊號。當這種情況發生時,我們需要告訴timeout更有力一點。

我們可以透過請求timeout來發送SIGKILL訊號。

SIGKILL訊號不能被“捕獲、阻止或忽略”——它總是透過。西格爾沒有禮貌地要求程式停止。西格基爾拿著秒錶和一個盒子躲在角落裡。

我們可以使用-s(signal)選項告訴timeout傳送SIGKILL訊號。

timeout -s SIGKILL 10 sudo tcpdump > capture.txt

如何在linux上使用timeout命令

這一次,只要過了10秒,tcpdump就會停止。

如何在linux上使用timeout命令

先禮貌地問

我們可以請求timeout嘗試停止使用SIGTERM的程式,並且僅在SIGTERM不工作時傳送SIGKILL。

為此,我們使用-k(kill after)選項。k選項需要一個時間值作為引數。

在這個命令中,我們請求timeout讓dmesg執行30秒,然後用SIGTERM訊號終止它。如果40秒後dmesg仍在執行,則表示忽略了SIGTERM,超時應傳送SIGKILL以完成作業。

dmesg是一個實用工具,可以監視核心環緩衝區訊息並在終端視窗中顯示它們。

timeout -k 40 30 dmseg -w

如何在linux上使用timeout命令

dmesg執行30秒,收到SIGTERM訊號時停止。

如何在linux上使用timeout命令

我們知道並不是SIGKILL阻止了dmesg,因為SIGKILL總是在終端視窗留下一個單詞的訃告:“被殺了。”這種情況並沒有發生。

檢索程式的退出程式碼

行為良好的程式在終止時將值傳遞迴shell。這被稱為退出程式碼。通常,這用於告訴shell(或啟動程式的任何程序)程式在執行時是否遇到問題。

timeout提供了它自己的退出程式碼,但是我們可能不關心這個。我們可能對超時控制的程序的退出程式碼更感興趣。

此命令允許ping執行5秒鐘。它正在ping一臺名為Nostromo的計算機,它位於用於研究本文的測試網路上。

timeout 5 ping Nostromo.local

如何在linux上使用timeout命令

命令執行5秒,超時終止。然後我們可以使用以下命令檢查退出程式碼:

echo $?

如何在linux上使用timeout命令

退出程式碼是124。這是timeout用於指示程式已使用SIGTERM終止的值。如果SIGKILL終止程式,退出程式碼是137。

如果我們用Ctrl+C中斷程式,超時的退出程式碼是零。

timeout 5 ping Nostromo.local echo $?

如何在linux上使用timeout命令

如果程式的執行在timeout終止之前結束,timeout可以將退出程式碼從程式傳遞迴shell。

要做到這一點,程式必須自動停止(換句話說,它不會因超時而終止),我們必須使用--preserve status選項。

如果使用值為5的-c(count)選項,ping只會發出5個請求。如果我們給超時一分鐘的持續時間,ping肯定會自動終止。然後我們可以使用echo檢查退出值。

timeout --preserve-status 1m ping -c 5 Nostromo.local echo $?

如何在linux上使用timeout命令

ping完成五個ping請求並終止。退出程式碼為零。

為了驗證退出程式碼是否來自ping,讓我們強制ping生成一個不同的退出程式碼。如果我們嘗試將ping請求傳送到一個不存在的IP地址,ping將失敗並返回一個錯誤退出程式碼。然後我們可以使用echo檢查退出程式碼是否為非零。

timeout --preserve-status 1m ping -c 5 NotHere.local echo $?

如何在linux上使用timeout命令

ping命令顯然無法到達不存在的裝置,因此它會報告錯誤並關閉。退出密碼是2。這是ping用於一般錯誤的退出程式碼。

制定基本規則

超時就是為執行程式提供一些邊界。如果存在日誌檔案溢位硬碟驅動器或忘記網路工具執行的危險,請將其包裝為超時並讓計算機自行調節。

  • 發表於 2021-04-03 12:23
  • 閱讀 ( 45 )
  • 分類:網際網路

你可能感興趣的文章

如何編譯自己的linux核心

... 在GRUB#U HIDDENŠU TIMEOUT和GRUBŠU HIDDENŠTIMEOUTŠ安靜線前放置一個Š標誌。之後,透過執行以下命令儲存這些更改: ...

  • 發佈於 2021-03-15 10:33
  • 閲讀 ( 43 )

如何在linux上安裝和使用powershell

... 在本文中,我將向您展示如何在Linux上安裝、執行和使用PowerShell! ...

  • 發佈於 2021-03-16 02:34
  • 閲讀 ( 52 )

如何用ukuu輕鬆升級ubuntu的linux核心

... 進入檔案後,在GRUB\u HIDDEN\u TIMEOUT和GRUB\u HIDDEN\u TIMEOUT\u QUIET條目前面新增一個#。接下來,按Ctrl+X儲存更改。但是,要使這些更改真正起作用,您需要輸入以下命令: ...

  • 發佈於 2021-03-16 09:57
  • 閲讀 ( 48 )

如何在android和termux上使用linux命令列

...許您在Android裝置上安裝誠實善良的Linux應用程式。下面是如何使用Termux應用程式。 ...

  • 發佈於 2021-03-18 07:26
  • 閲讀 ( 63 )

如何在windows10上獲得linux bash shell

... 如何在windows10上安裝linux bash shell ...

  • 發佈於 2021-03-21 11:48
  • 閲讀 ( 60 )

linux下如何重新命名檔案

要在Linux中重新命名檔案嗎?如果您知道如何在Windows、macOS或Chrome作業系統中完成這項工作,那麼您就知道如何在這裡完成這項工作。在大多數版本的Linux上,您只需右鍵單擊一個檔案並選擇Rename選項。 ...

  • 發佈於 2021-03-22 02:48
  • 閲讀 ( 65 )

如何在linux中新增使用者

想在Linux系統上新增使用者但不知道如何新增?在Linux上使用命令列介面管理使用者無疑是一項複雜的工作。而對於初學者來說,即使新增新使用者也是一場噩夢。 ...

  • 發佈於 2021-03-26 23:29
  • 閲讀 ( 66 )

如何在linux終端中檢視和更改引導序列

... BootCurrent: 0000Timeout: 2 secondsBootOrder: 0000,0004,0005,0003Boot0000* ubuntuHD(...)/File(\EFI\UBUNTU\SHIMX64.EFI)Boot0003* Hard DriveBBS(...)Boot0004* UEFI: JetFlashTranscend 32GB 1100 ...Boot0005* UEFI: JetFlashTranscend 32GB 1100, Part...

  • 發佈於 2021-03-27 06:23
  • 閲讀 ( 41 )

終極樹莓皮命令備忘單

...rame to filename --verbose, -vVerbose debugging information during run--timeout, -tSet a time to wait before capturing an image.--encoding, -eEncoding to use for output file - jpg, gif, bmp, or pngRaspi Camera VideoraspividCommand to take a video using attached camera, modify with arguments...

  • 發佈於 2021-03-30 18:59
  • 閲讀 ( 57 )

linux下如何使用rclone備份google驅動

...; /usr/bin/rclone copy --update --verbose --transfers 30 --checkers 8 --contimeout 60s --timeout 300s --retries 3 --low-level-retries 10 --stats 1s "/home/dave/Documents" "google-drive:LinuxDocs" 以下是引數的含義: 複製:將檔案從本地計算機複製到遠端儲存,跳過已存在...

  • 發佈於 2021-04-02 18:51
  • 閲讀 ( 50 )
年糕乖不乖
年糕乖不乖

0 篇文章

作家榜

  1. admin 0 文章
  2. 孫小欽 0 文章
  3. JVhby0 0 文章
  4. fvpvzrr 0 文章
  5. 0sus8kksc 0 文章
  6. zsfn1903 0 文章
  7. w91395898 0 文章
  8. SuperQueen123 0 文章

相關推薦