為什麼 kill 沒有文件參數而不是埠號?
如果我想停止給定其 tcp 埠號或文件或命名執行檔的程序,我可以執行
kill -tcpPortNumber $1
參數$1
是 tcp 埠號或kill -filename $1
參數是文件名的地方嗎?背景是以下問題中的一個問題:https://stackoverflow.com/questions/11583562/how-to-kill-process-running-on-particular-port-in-linux
這個問題在實踐中確實發生了,我認為使用者 Bepetersn 有一個看起來像我的意思的解決方案。
sudo kill $(fuser -n tcp <port_number> 2> /dev/null)
但我想要實現的是,kill 程序可以將 tcp 埠號和/或文件名作為任何使用者的系統範圍的參數,包括 sudo。那麼是否可以將系統範圍內的參數添加到像 kill 這樣的系統程序中,以便 tcp 埠號和/或文件名可以作為參數,並且這種更改對於包括 ubuntu sudo 在內的任何使用者都是永久性的?
不,不可能以
kill
您要求的方式修改工具,例如通過配置。但是鑑於所有工具通常都以原始碼形式提供,您始終可以使用任何工具並以您喜歡的任何方式對其進行修改。然而,大多數工具都以下列方式之一進行擴展:
1.包裝
此外,大多數人傾向於“包裝”通常在大多數 Unix 系統上提供的命令,使用它們各自的 shell 中的 shell 腳本或別名或函式(Bash、Zsh、Ksh 等)。
2. 高級語言
此外,許多由工具呼叫的 glibc 庫
kill
也暴露於更高級別的語言,因此您可以使用 Python、Perl 或 Ruby 等語言創建所需的任何工具。3.連結
最後一種方法可能是大多數人傾向於使用的方法。您從一個命令獲取輸出並將其與另一個工具一起用作輸入。命令行中的整個 UI 都是基於這個單一目的而建構的。因此,您可以使用許多結構來做到這一點。
$ kill $(pgrep myscript.sh) $ find . -type f -exec ... {} + $ ls -l | grep ... $ find . -type f -print0 | xargs ....
名單還在繼續……
你的問題
因此,使用以下命令:
$ sudo kill $(fuser -n tcp <port_number> 2> /dev/null)
您可以將其包裝到 Bash 函式中:
$ mykill () { sudo kill $(fuser -n tcp "$1" 2> /dev/null); }
稍微改變一下,這樣我們就可以看到執行它時會發生什麼:
$ mykill () { echo "sudo kill \$(fuser -n tcp "$1" 2> /dev/null)"; } $ mykill 123 sudo kill $(fuser -n tcp 123 2> /dev/null)
自古以來,UNIX 的理念一直是“建構簡短、簡單、清晰、模組化和可擴展的程式碼”,因此一個基於埠號的超級工具太複雜而無法維護,另一方面,
kill
它的目的是發送向程序發出信號(恰好結束它們)不一定“殺死”它們。我已經搜尋了一個可以做到這一點的工具,沒有人發現只能做到這一點(通常它們與其他工具/功能捆綁在一起或者使用複雜)。當然你可以用它
kill -SIGNAL $(lsof -i:port)
來發送你喜歡的任何信號。