:参数必须是进程或作业 ID

:参数必须是进程或作业 ID

我想运行一个简单的 bash 脚本(下面称为 killprocess.sh)来终止远程机器中在特定端口(比如 8080)运行的特定进程/服务,其中两台机器都装有 OS Ubuntu 18.04.1 LTS。

我按照如下方式通过 ssh(openssh)建立连接来执行脚本。连接也成功建立。

sshpass -p "password" ssh -n [email protected] -f "/bin/bash /home/killprocess.sh"

killprocess.sh 的内容如下。

processID=$(lsof -t -i:8080)
echo $processID
kill $processID

虽然它正确地在控制台上打印了进程 ID,但它给出了下面的错误消息,意味着无法终止它。

:参数必须是进程或作业 ID

答案1

运行fromdos killprocess.sh命令以使您的脚本运行(它包含在tofrodos包中)。

原因如下。

错误消息表明您是在 Windows 文本编辑器中编写脚本的,该编辑器对行尾的处理方式不同(\r\n在行尾添加 ,而不仅仅是\n)。错误消息值得怀疑,因为它应该是这样的

bash: kill: meh: arguments must be process or job IDs

kill只有当命令的参数包含(回车)字符时,它才会输出您提到的一行\r。因此,当打印错误消息时,在第三个冒号之前,光标会跳回到行首,其余错误消息将覆盖到目前为止打印的所有内容。这也解释了为什么命令kill会抱怨:它收到了类似 的内容1234\r,这不可能是进程 ID。

最有可能的原因是,你的脚本的第一行实际上是

processID=$(lsof -t -i:8080)\r

但你\r当然看不到这个字符,因为它是非打印字符。你在第二行的输出中也看不到它,因为它输出了行,光标跳回到开头,但换行符导致光标转到下一行。

顺便说一句,如果 bash 错误消息以冒号开头,则总是怀疑是 unix/windows 行尾问题。

相关内容