2012-01-16 76 views
6

我是新来的UNIX。我想用像这样的脚本启动我的Java应用程序:启动和杀害Java应用程序与shell脚本(Debian的)

这应该是工作。它确实运行了应用程序,它确实写入了pid文件。但是,当我尝试与包含此不同的脚本来停止进程:

#!/bin/sh 
kill -9 /var/run/ScriptCheck.pid 

控制台给我这个错误:

bash: kill: /var/run/ScriptCheck.pid: arguments must be process or job IDs 

我最好的猜测是,我不写正确的代码在停止脚本中,可能不会提供正确的命令来打开.pid文件。 任何帮助将非常感激。

回答

12

你传递一个文件名作为参数传递给kill时,它需要一个(理线ID)号码,所以只是从文件中读取的进程ID,并把它传递给kill

#!/bin/sh 
PID=$(cat /var/run/ScriptCheck.pid) 
kill -9 $PID 
+0

非常感谢你!这就是我正在寻找的:) – rMaero 2012-01-16 18:50:49

+1

为了记录,您可以使用'$( Kevin 2012-01-16 18:59:02

+0

在sh中不起作用,在bash中工作,更好地使用cat – milan 2012-01-16 19:01:52

0

我认为你需要在ScriptCheck.pid文件的内容(这我假设只有一个与进程的PID的第一行中的条目)读取。

#!/bin/sh 
procID=0; 
while read line  
do  
    procID="$line"; 
done </var/run/ScriptCheck.pid 
kill -9 procID 
+0

我不明白你写有while循环,甚至,它仍然没有工作。控制台现在显示相同.. 我也认为我需要阅读pid文件的内容,但是这是我不知道该怎么办的 – rMaero 2012-01-16 18:44:59

+0

这仍然不起作用,您必须在'kill'内插'$ procID'。 – tripleee 2012-01-16 18:46:57

0

我从来没有创建自己的PID;你的问题很有趣。

这里是一个bash代码片段,我发现:

#!/bin/bash 

PROGRAM=/path/to/myprog 
$PROGRAM & 
PID=$! 
echo $PID > /path/to/pid/file.pid 

您必须具有root权限才能把你的file.pid到/ var/run中的很多文章--referenced - 这是为什么守护进程具有root权限。

在这种情况下,你需要把你的PID一些约定的地方,知道你的启动和停止脚本。您可以使用pid文件存在的事实,例如,不允许第二个相同的进程运行。

的$ PROGRAM &把脚本到后台“批量”模式。

如果您希望程序脚本退出后流连,我建议用nohup的,这意味着该方案不会死,当你的脚本注销启动它。

我只是检查。 PID以nohup返回。

2

快速和脏方法将是:

kill -9 $(cat /var/run/ScriptCheck.pid) 
2

您的语法错了,kill需要一个进程ID,而不是一个文件。除非你完全知道你在做什么,否则你也不应该使用kill -9

kill $(cat /var/run/ScriptCheck.pid) 

xargs kill </var/run/ScriptCheck.pid 
相关问题