因此,我想要找到一个整洁的解决方案的问题是,当我登录到服务器(我有一些 Solaris 和 RHEL 实例)时,我会尝试找出正在运行的应用程序:
$ ps -auxww | grep <thing I look for, usually Java>
我得到了一个包含进程、PID、额外详细信息以及执行该进程的完整名称和参数的列表。虽然这个一般来说为我提供了足够的信息来找出正在运行的内容,有些服务器的运行方式不同。我可能有一个服务器有多个用于不同目的的应用服务器实例。其他进程是我混在一起的挂起进程的残余非冷冻进程。我不想关闭所有 Java 实例,因为我无法找出需要终止哪个进程。
我想要提供的解决方案是,在我的启动脚本期间,我想在进程前面添加或附加一些文本,以便我插入一个简短的描述。有什么可以让我做到这一点吗?
如果我所要求的事情听起来不可能/愚蠢/完全不合常理,我愿意接受其他解决方案,这些解决方案能让我有能力完成同样的事情。我愿意接受各种想法,但这个想法似乎是可行的。
答案1
以下是一个例子重力的建议:
$ MARKER=snooze sleep 120&
$ ps ew | grep -o ".*[M]ARKER=snooze"
11741 pts/2 S 0:00 sleep 120 MARKER=snooze
该e
选项ps
打印进程的环境。该-o
选项和正则表达式会grep
切断我们搜索的部分之后的任何环境,但我不敢打赌它总是能得到如此干净的结果(可能会打印出更多的环境)。将模式的一部分放在方括号中可执行人们经常使用 for - 的功能,以从结果中grep -v
消除其本身。grep
答案2
听起来你想给每个进程添加唯一的标签,这样你就能轻松地发现它。我实际上听说一家大型公司的监控团队就是这么做的 - 每个应用程序都有一个唯一的代码,可以通过 ps 和 grep 轻松找到。
在 Java 上,您可以使用 -D 设置任何变量,因此您可以轻松添加类似“-Dmonitoringid=”的内容。该过程会忽略它,但您可以轻松地 grep 它。
或者,您可以将应用服务器拆分成多个,每个服务器都运行在特定于所服务应用程序的 ID 下。我们目前运行着一个大型 J2EE 应用服务器群,每个服务器上都有许多应用程序,但是每个服务器都运行在自己的 ID 下,以划分所有权、访问权限、控制权等。
这也意味着在主机上查找任何给定的应用服务器非常简单:
ps <whichever ps args you like best> | grep java | grep <uid> | grep -v grep