【问题标题】:Check if a specific Linux Terminal is already open检查特定的 Linux 终端是否已打开
【发布时间】:2016-03-16 10:04:45
【问题描述】:

我们有一个服务器启动脚本,它调用 Mate 终端(或 GNOME 终端 - 不应该有所作为)作为服务器启动过程的一部分,本质上是这样跟踪服务器信息日志:

mate-terminal --title="APPSERVER LOG" --working-directory=$SERVER_LOCATION --hide-menubar -e "sh -c 'tail -f --retry -n 400 ./server.log'" &

现在正如您想象的那样,在开发一个终端时,由于多次服务器重新启动,最终会出现相当多的开放终端都在拖尾相同的日志文件。

现在我的问题是:是否有可能以某种方式检查打开的终端是否有特定的运行命令、特定的标题或类似内容,以仅在没有尾随的情况下才打开一个新终端?

我检查了 mate-terminal 的手册页,但找不到任何可以执行任何窗口管理的内容。

我们正在运行 CentOS7 和 MATE 1.12.1

cat /etc/*release
CentOS Linux release 7.2.1511 (Core) 

【问题讨论】:

  • 您可以尝试从 ps -ax grep 终端的 pid。如果 pid 存在,则打开终端,否则不打开。我希望我能很好地理解你想要做什么。
  • @kitz 在下面的问题中查看我的评论。

标签: linux terminal centos7 tail mate-desktop


【解决方案1】:

您可以尝试像这样 grep mate 的 pid:

pgrep -d " " -f path/to/mate/terminal/binary

然后你决定是否有必要打开另一个,杀死现有的,或者任何你想要的:)

【讨论】:

  • 问题是ps aux | grep "mate-terminal" 只列出了一个 mate-terminal 实例,尽管我目前打开了 >10 个终端窗口...? $ ps aux | grep mate-terminal user+ 26601 0.1 0.2 620616 25924 ? Sl 10:40 0:02 mate-terminal --working-directory=/home -e sh -c "./skript" pgrep 也只列出了一个终端的pid,这不是我要找的那个。所以看起来 MATE 并没有为每个终端窗口生成新进程?
  • 好吧,我的错,我们通过sh -c 调用尾部的方式将导致尾部被列为user+ 26697 0.0 0.0 107932 688 pts/1 Ss+ 10:40 0:00 tail -f --retry -n 400 ./server.log,因此不会命中“mate”或“mate-terminal”。无论如何,我应该能够找到正确的尾巴。非常感谢!
【解决方案2】:

对于它的价值:基于@kitz 答案,我现在最终不使用 pgrep 获取进程 ID 并且不打开新的拖尾窗口,而是使用 pkill 关闭现有的并再次拖尾.原因是日志文件可能同时被删除了,所以即使是--retry,它只适用于初始打开,原来的尾部可能已经丢失了日志。

原来如此:

TAILCMD="tail -f --retry -n 400 ./server.log"
pkill -ef "$TAILCMD"
mate-terminal --title="Server Log" --working-directory=$SERVER_LOCATION --hide-menubar -e "sh -c '${TAILCMD}'" &

再次感谢@kitz 为我指明了正确的方向!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-08-03
    • 1970-01-01
    • 1970-01-01
    • 2011-05-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多