Bash pkill-njava可以在控制台上工作,但不能在脚本中工作

Bash pkill-njava可以在控制台上工作,但不能在脚本中工作,bash,scripting,Bash,Scripting,我正在尝试编写一个运行java程序“循环”的脚本,然后在5秒钟后终止该java程序,然而,当我使用“pkill”选项时,它并没有终止该程序,我很抱歉问了这么一个基本的问题,我已经在internet上查找过,但我找不到解决方案。这是我的密码: #!/bin/bash javac Loop.java java Loop sleep 5 pkill -n java 当我从终端运行命令pkill-n java时,与在脚本中运行相反,它会按照我的预期运行,这是为什么?您的bash脚本正在等待java完成

我正在尝试编写一个运行java程序“循环”的脚本,然后在5秒钟后终止该java程序,然而,当我使用“pkill”选项时,它并没有终止该程序,我很抱歉问了这么一个基本的问题,我已经在internet上查找过,但我找不到解决方案。这是我的密码:

#!/bin/bash
javac Loop.java
java Loop
sleep 5
pkill -n java

当我从终端运行命令pkill-n java时,与在脚本中运行相反,它会按照我的预期运行,这是为什么?

您的bash脚本正在等待
java
完成,因此您需要将其作为后台进程运行,该进程将启动循环代码,然后立即返回,从而允许脚本的其余部分运行:

java Loop &

更多信息:

因为您在前台运行
java循环
,所以下一行
sleep 5
直到JVM退出才会执行(如果
Loop
实际上是一个无限循环,那么这可能永远不会执行)

所以你需要从后台开始:

java Loop &
另外,要终止特定的后台作业(而不是终止最新的JVM),可以执行以下操作:

kill $!

请试着用一个标题来区分你们的问题和其他关于bash的问题。一个很好的答案——我唯一的狡辩是建议的参考。ABS不太注意在其示例中展示良好的实践,这使得它对于初学者来说往往是一个糟糕的选择!做它是如何找到循环的PID的?它是一个bash特殊参数,“扩展到最近执行的后台(异步)命令的进程ID”:
$
返回最后执行的命令的pid,在本例中是java调用。为什么还需要美元符号,当然您只需要“!”参数,因为它“扩展到最近执行的后台(异步)命令的进程ID。”