2012-07-26 47 views
13

这就是我现在所拥有的在bash脚本:bash脚本,杀进程由PID文件拉动

ps aux | grep glassfish | grep domain1 | gawk '{print $2}' | xargs kill -9 

这样做的问题是,如果有人登录并拉动相关的东西的GlassFish ,它也将拉动该PID。从而导致杀死错误的PID。

所以我的问题是如何解决我只需要拉正确的PID,以及如何重写它以从glassfish生成的PID文件中提取PID。

+11

kill -9有点苛刻,你确定你需要这种暴力吗? :-) – 2012-07-26 15:29:03

回答

17

编辑启动glassfish的脚本,并在启动进程的行之后立即放置类似echo $$ > /path/to/PID-file(主目录可包含~或其他某种机制,如$USER以使用户特定)的脚本。然后您可以使用kill $(cat /path/to/PID-file)杀死正确的进程。

+0

顺便说一句ps a(删除“只有你自己”),不在代码中。我错误地从旧代码粘贴了这个。 – 2012-07-26 15:47:48

+4

UUOC for bash。 '$(<文件)' – jordanm 2012-07-26 16:03:32

+4

@jordanm在这里使用猫的性能影响几乎不可测量,更不用说对用户显而易见了。我会采取更好的可读性*任何*一天。如果它让你感觉更好,你可以用'less'替换它,但是'$( Thor84no 2012-07-26 16:14:21

0
ps aux | grep ^$USER | grep glassfish | grep domain1 | gawk '{print $2}' | xargs kill -9 

下面我错了ps开关,所以上面的grep应该没问题。


啊它不工作, ps可能是这样 ps -ao pid,tty,comm -u $USER使用,超过这个grep的应该是罚款...

someone else is logged in ...

如果是这样,添加开关-u

ps aux -u $USER | grep glassfish | grep domain1 | gawk '{print $2}' | xargs kill -9 

$ USER是将被选择和列出的用户名,默认情况下应该是已经在OS环境中设置。多个用户可以通过逗号 ps aux -u root,$USER选择

拿一张纸条:如果系统中没有特定的用户名,PS将抛出 错误:用户名不存在。

阅读 man ps了解更多信息。

-u userlist Select by effective user ID (EUID) or name. This selects the processes whose effective user name or ID is in userlist. The effective user ID describes the user whose file access permissions are used by the process (see geteuid(2)). Identical to U and --user.