所以我想找到一个整洁的解决方案的问题是,当我登录到服务器时(我有一些 Solaris 和 RHEL 实例),我试图找出正在运行的应用程序:
$ ps -auxww | grep <thing I look for, usually Java>
我得到了一个很好的进程列表、PID、额外的细节,以及整个进程名称和使用它执行的参数。虽然这通常为我提供了足够的信息来了解正在运行的内容,但某些服务器的运行方式有所不同。我可能有一个服务器,它具有用于不同目的的应用服务器的多个实例。其他进程是我与非冻结进程混合的挂起进程的残余。我不想关闭所有 java 实例,因为我找不到需要杀死的进程。
我想提供的解决方案是在我的启动脚本期间,我想在进程前添加或附加一些文本,让我在其中添加简短描述。有什么可以让我这样做吗?
如果我要问的问题听起来不可能/愚蠢/完全不合时宜,我愿意接受其他解决方案,让我有能力完成同样的事情。我对想法持开放态度,但这一个突然出现是可行的。
听起来您想对每个进程进行唯一标记,以便轻松发现它。我实际上听说他们的监控团队在一家大型公司完成了这项工作 - 每个应用程序都有一个独特的代码,可以使用 ps 和 grep 轻松找到。
在 java 上,您可以使用 -D 设置任何变量,因此您可以轻松添加类似“-Dmonitoringid =”的内容。该过程将忽略它,但您可以轻松地对其进行 grep。
或者,您可以将您的应用程序服务器拆分为每个运行在特定于所服务应用程序的 ID 下。我们目前运行着一个大型的 J2EE 应用服务器场,每个盒子上有许多应用程序,但是,每个应用程序都在自己的 ID 下运行,以分离所有权、访问权、控制权等。
这也意味着在主机上查找任何给定的应用服务器非常简单:
ps <whichever ps args you like best> | grep java | grep <uid> | grep -v grep
这是重力建议的一个例子:
该
e
选项使ps
打印过程的环境。该-o
选项和正则表达式会grep
在我们搜索的部分之后切断任何环境,但我不会打赌它总是会产生如此干净的结果(可能会打印更多的环境)。将模式的一部分放在方括号中执行人们经常使用的功能grep -v
for - 从结果中消除grep
自身。