Nik*_* R. 0 shell networking process kill
如果我想根据其 tcp 端口号或其文件或命名的可执行文件停止程序,我可以运行类似kill -tcpPortNumber $1
参数$1
为 tcp 端口号或kill -filename $1
参数为文件名的程序吗?背景是以下问题中的一个问题:
这个问题在实践中确实发生过,我认为用户 Bepetersn 有一个看起来像我的意思的解决方案。 sudo kill $(fuser -n tcp <port_number> 2> /dev/null)
但是我想要实现的是,kill 程序可以将 tcp 端口号和/或文件名作为任何用户(包括 sudo)的系统范围参数。那么是否可以将系统范围内的参数添加到像 kill 这样的系统程序中,以便 tcp 端口号和/或文件名可以作为参数,并且这种更改对于包括 ubuntu sudo 在内的任何用户都是永久性的?
自古以来,UNIX 的哲学就是“构建简短、简单、清晰、模块化和可扩展的代码”,因此,基于端口号进行杀戮的超级工具太复杂而无法维护,另一方面,kill
它旨在发送向进程发出信号(恰好结束它们)不一定“杀死”它们。
我已经搜索了一个可以做到这一点的工具,但没有人发现只能做到这一点(通常它们与其他工具/功能捆绑在一起,或者使用起来很复杂)。当然,您可以使用kill -SIGNAL $(lsof -i:port)
发送任何您喜欢的信号。
不,不可能以kill
您要求的方式修改工具,例如通过配置。但是鉴于所有工具通常都以源代码形式提供,您可以随时使用任何工具并以您喜欢的任何方式对其进行修改。
然而,大多数工具都通过以下方式之一进行扩展:
此外,大多数人倾向于使用 shell 脚本或别名或它们各自的 shell(Bash、Zsh、Ksh 等)中的函数来“包装”大多数 Unix 系统上通常提供的命令。
此外,许多由工具调用的 glibc 库kill
也暴露于更高级别的语言,因此您可以使用 Python、Perl 或 Ruby 等语言创建您想要的任何工具。
最后一种方法可能是大多数人倾向于使用的方法。您从一个命令中获取输出并将其与另一个工具一起用作输入。命令行中的整个 UI 都是以这个单一目的构建的。因此,您可以使用许多构造来完成此操作。
$ kill $(pgrep myscript.sh)
$ find . -type f -exec ... {} +
$ ls -l | grep ...
$ find . -type f -print0 | xargs ....
Run Code Online (Sandbox Code Playgroud)
名单还在继续......
所以使用以下命令:
$ sudo kill $(fuser -n tcp <port_number> 2> /dev/null)
Run Code Online (Sandbox Code Playgroud)
你可以把它包装成一个 Bash 函数:
$ mykill () { sudo kill $(fuser -n tcp "$1" 2> /dev/null); }
Run Code Online (Sandbox Code Playgroud)
稍微改变一下,以便我们可以看到运行它时会发生什么:
$ mykill () { echo "sudo kill \$(fuser -n tcp "$1" 2> /dev/null)"; }
$ mykill 123
sudo kill $(fuser -n tcp 123 2> /dev/null)
Run Code Online (Sandbox Code Playgroud)