Bash脚本:通过PID文件杀死进程

13

目前我在bash脚本中有以下代码:

ps aux | grep glassfish | grep domain1 | gawk '{print $2}' | xargs kill -9
这样做的问题在于,如果有其他人登录并拉取与GlassFish相关的内容,它也会拉取那个PID,导致杀死错误的PID。
所以我的问题是如何修复我现在的方法只拉取正确的PID,并且如何重写它以从GlassFish生成的PID文件中提取PID。

11
kill -9 有点过于激烈了,您确定需要这种暴力操作吗? :-) - Paulo Scardine
2个回答

17

编辑启动Glassfish的脚本,并在启动进程的行后面放置类似于 echo $$ > /path/to/PID-file 的内容(这可以包含~来表示主目录或其他机制,比如$USER以使其与用户相关)。然后你就可以使用 kill $(cat /path/to/PID-file) 来关闭正确的进程。


顺便提一下,ps a(去掉“只有你自己”)不在代码中。我错误地从旧代码中粘贴了这个。 - Joshua Sutton
4
在这里使用cat的性能影响几乎不可测量,更不用说对用户有什么明显影响了。我宁愿追求更好的可读性。如果你觉得使用 less 会更好一些,那也可以替换掉cat,但是 $(< file) 会让绝大部分新手感到困惑。 - Vala

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应该没问题...

有人已经登录了...

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

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

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

注意:如果系统中没有特定的用户名,ps 将会抛出ERROR: User name does not exist.

阅读man ps获取更多信息。

-u userlist 通过有效用户ID(EUID)或名称进行选择。 这将选择其有效用户名称或ID位于userlist中的进程。有效用户ID描述了进程使用其文件访问权限的用户(请参见geteuid(2))。与U和--user相同。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接