Shell

為什麼 kill 沒有文件參數而不是埠號?

  • February 20, 2014

如果我想停止給定其 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)來發送你喜歡的任何信號。

引用自:https://unix.stackexchange.com/questions/116183