Bash pkill-njava可以在控制台上工作,但不能在脚本中工作
我正在尝试编写一个运行java程序“循环”的脚本,然后在5秒钟后终止该java程序,然而,当我使用“pkill”选项时,它并没有终止该程序,我很抱歉问了这么一个基本的问题,我已经在internet上查找过,但我找不到解决方案。这是我的密码: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完成
#!/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。”