隨著工作和生活節奏的加快,我們經常需要在Linux系統中設定一些時間限制來控制我們的行為。無論是限制使用者登入時間或限制進程運行時間,Linux系統都提供了多種方法來實現這一目的。那麼,你知道如何在Linux系統中設定時間限制嗎?本文將介紹幾種常見的方法,讓你輕鬆掌握。
timeout是一個命令列實用程序,它運行指定的命令,如果在給定的時間段後仍在運行,則終止該命令。 timeout指令是GNU核心實用程式軟體包的一部分,該軟體包幾乎安裝在所有Linux發行版中
如何使用
語法格式:
timeout [OPTION] DURATION COMMAND [ARG]...
DURATION可以是正整數或浮點數,後面接著可選的後綴:
#如果不新增任何單位,預設是秒。如果DURATION為0,則關聯的逾時是停用的。
實例
5秒後終止ping操作:
[root@localhost ~]# timeout 5 ping www.baidu.com PING www.a.shifen.com (61.135.169.125) 56(84) bytes of data. 64 bytes from 61.135.169.125 (61.135.169.125): icmp_seq=1 ttl=55 time=16.3 ms 64 bytes from 61.135.169.125 (61.135.169.125): icmp_seq=2 ttl=55 time=16.0 ms 64 bytes from 61.135.169.125 (61.135.169.125): icmp_seq=3 ttl=55 time=16.7 ms 64 bytes from 61.135.169.125 (61.135.169.125): icmp_seq=4 ttl=55 time=16.0 ms 64 bytes from 61.135.169.125 (61.135.169.125): icmp_seq=5 ttl=55 time=17.6 ms
#
5分鐘之後終止ping操作:
[root@localhost ~]# timeout 5m ping www.baidu.com
1天之後終止ping操作:
[root@localhost ~]# timeout 1d ping www.baidu.com
2.5秒之後終止ping操作:
[root@localhost ~]# timeout 2.5s ping www.baidu.com PING www.a.shifen.com (61.135.169.121) 56(84) bytes of data. 64 bytes from 61.135.169.121 (61.135.169.121): icmp_seq=1 ttl=55 time=14.9 ms 64 bytes from 61.135.169.121 (61.135.169.121): icmp_seq=2 ttl=55 time=15.6 ms 64 bytes from 61.135.169.121 (61.135.169.121): icmp_seq=3 ttl=55 time=15.6 ms
發送指定的訊號
如果未給予任何訊號,則當達到時間限制時,timeout將SIGTERM訊號傳送到受管指令。可以使用-s(-signal)選項指定要傳送的訊號。
發送SIGKILL訊號給ping指令,5秒鐘後終止:
[root@localhost ~]# sudo timeout -s SIGKILL 5s ping www.baidu.com PING www.a.shifen.com (61.135.169.125) 56(84) bytes of data. 64 bytes from 61.135.169.125 (61.135.169.125): icmp_seq=1 ttl=55 time=17.2 ms 64 bytes from 61.135.169.125 (61.135.169.125): icmp_seq=2 ttl=55 time=16.6 ms 64 bytes from 61.135.169.125 (61.135.169.125): icmp_seq=3 ttl=55 time=16.7 ms 64 bytes from 61.135.169.125 (61.135.169.125): icmp_seq=4 ttl=55 time=16.2 ms 64 bytes from 61.135.169.125 (61.135.169.125): icmp_seq=5 ttl=55 time=16.7 ms Killed
#
訊號可以指定他的名字也可以指定他序號。下面使用的事SIGKILL的序號,5秒鐘後終止操作:
[root@localhost ~]# sudo timeout -s 9 5s ping www.baidu.com PING www.a.shifen.com (61.135.169.121) 56(84) bytes of data. 64 bytes from 61.135.169.121 (61.135.169.121): icmp_seq=1 ttl=55 time=15.5 ms 64 bytes from 61.135.169.121 (61.135.169.121): icmp_seq=2 ttl=55 time=16.3 ms 64 bytes from 61.135.169.121 (61.135.169.121): icmp_seq=3 ttl=55 time=14.9 ms 64 bytes from 61.135.169.121 (61.135.169.121): icmp_seq=4 ttl=55 time=16.0 ms 64 bytes from 61.135.169.121 (61.135.169.121): icmp_seq=5 ttl=55 time=22.0 ms Killed
#
想要知道全部可用的訊號,請使用 kill -l該指令查看全部的訊號。
[root@localhost ~]# kill -l 1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP 6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL 10) SIGUSR1 11) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM 16) SIGSTKFLT 17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP 21) SIGTTIN 22) SIGTTOU 23) SIGURG 24) SIGXCPU 25) SIGXFSZ 26) SIGVTALRM 27) SIGPROF 28) SIGWINCH 29) SIGIO 30) SIGPWR 31) SIGSYS 34) SIGRTMIN 35) SIGRTMIN+1 36) SIGRTMIN+2 37) SIGRTMIN+3 38) SIGRTMIN+4 39) SIGRTMIN+5 40) SIGRTMIN+6 41) SIGRTMIN+7 42) SIGRTMIN+8 43) SIGRTMIN+9 44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13 48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-12 53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9 56) SIGRTMAX-8 57) SIGRTMAX-7 58) SIGRTMAX-6 59) SIGRTMAX-5 60) SIGRTMAX-4 61) SIGRTMAX-3 62) SIGRTMAX-2 63) SIGRTMAX-1 64) SIGRTMAX [root@localhost ~]#
停止卡住的進程
SIGTERM,當超過時間限制時發送的預設訊號可以被某些進程捕獲或忽略。在這種情況下,進程在發送終止訊號後繼續運作。
要確保被執行的的命令終止,請使用-k(–kill after)選項,後面再加一個時間。當達到給定的時間限制後會強制結束。
在下面的範例中,timeout指令運行一分鐘,如果指令沒有結束,將在10秒後終止指令:
[root@localhost ~]# timeout -k 10s 1m sh test.sh
運行在前台
#預設情況下,timeout在後台運行託管命令。如果要在前台執行該命令,請使用–foreground選項:
[root@localhost ~]# timeout --foreground 5m ./script.sh
總結
本文介紹了Linux系統中設定時間限制的幾種常見方法,包括使用ulimit指令、使用pam_time模組、使用cron定時任務等。透過對這些方法的了解,你可以更好地控制使用者行為、優化系統效能、防止資源浪費等。希望讀者能根據實際需求選擇適合自己的方法,並加以應用。
以上是掌握這幾種方法,讓你在Linux系統中輕鬆設定時間限制的詳細內容。更多資訊請關注PHP中文網其他相關文章!