【问题标题】:Bash Script, Kill process by pulling from PID fileBash 脚本,通过从 PID 文件中提取来终止进程
【发布时间】:2012-07-25 05:44:46
【问题描述】:

这就是我现在在 bash 脚本中的内容:

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

这样做的问题是,如果其他人登录并拉取与 glassfish 相关的内容,它也会拉取该 PID。从而导致杀死错误的PID。

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

【问题讨论】:

  • kill -9 有点苛刻,你确定需要这种暴力吗? :-)

标签: linux bash shell glassfish pid


【解决方案1】:

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

【讨论】:

  • 顺便说一句 ps a (删除“只有你自己”),不在代码中。我错误地从旧代码中粘贴了这个。
  • @jordanm 在这里使用 cat 对性能的影响几乎无法衡量,更不用说用户注意到了。我会在任何天提高可读性。如果它让你感觉更好,你可以用less 代替它,但是$(< file) 会让绝大多数新手感到困惑。
【解决方案2】:
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 用户列表 按有效用户 ID (EUID) 或名称选择。 这将选择其有效用户名或 ID 在用户列表中的进程。有效用户 ID 描述了其用户 进程使用文件访问权限(请参阅 geteuid(2))。 完全相同的 给 U 和 --user。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-08-04
    • 2010-10-06
    • 2011-12-10
    • 1970-01-01
    • 2012-03-14
    • 2016-02-29
    • 1970-01-01
    • 2011-05-10
    相关资源
    最近更新 更多