等待 PID - 显示在 ps 中

等待 PID - 显示在 ps 中

我在脚本中使用下面的命令来等待 PID,然后在该进程完成时执行某些操作: while ps -p [pid] > /dev/null; do sleep 1; done; [cmd] 其中 [pid] 是正在运行的进程的 PID,[cmd] 是我想要在其完成后执行的命令。现在我的问题是:有没有办法使用 ps 或其他命令来查看我的进程(脚本)是否正在等待进程 [pid]?

答案1

使用 Zenity

相对容易做到的是:

  • 生成一条Zenity消息,提及您的脚本正在等待 pid 出现。
  • 如果 pid 出现在脚本运行的或任何其他命令ps -p <pid>ps -e输出中,窗口将自动关闭。ps

    在此处输入图片描述

例子

下面是如何完成此操作的过程。
我使用的python是示例,您可以将其实现到 bash,或者(为什么不呢)只需使用 python 脚本并使用您的 pid 作为参数运行它。

原则

  1. 在循环中,脚本检查 pid 是否在输出中(在我的示例中)ps -e
  2. 如果没有,脚本会调用一个Zenity窗口,提示你正在等待 pid

    笔记:该脚本还会Zenity利用以下命令检查窗口是否已经存在:

    wmctrl -l
    

    列出了所有窗口。如果我们不包括此步骤,您将会被弹出的窗口所困扰……

    调用窗口的命令Zenity

    zenity --info --title='pid-message' --text='Waiting for pid to appear'
    
  3. 一旦 pid 出现在 中ps -e,窗口就会关闭,命令如下:

    wmctrl -c <windowname>
    

或者,只需使用下面的脚本

如果您在运行命令之前启动下面的脚本,它将等待 pid 出现,同时脚本运行。

  • 安装wmctrl

    sudo apt-get install wmctrl
    
  • 将脚本复制到一个空文件中,另存为waitfor_pid.py

  • 使用命令运行它

    python3 /path/to/waitfor_pid.py <pid>
    

剧本

#!/usr/bin/env python3
import subprocess
import sys
import time

# the pid you are waiting for, as an argument
pid = sys.argv[1]
# The title of the window; if you change it, make sure it does not have space(s)
window_title = "pid-message"

t = 0 
# the script waits for the pid during 30 seconds, to prevent endless loop if your command is not succesful
while t < 30:
    # check the list of processes
    p_list = subprocess.check_output(["ps", "-e"]).decode("utf-8")
    # check the windowlist, to see if the Zenity window already exists
    if not pid in p_list:
        w_list = subprocess.check_output(["wmctrl",  "-l"]).decode("utf-8")
        if not "pid-message" in w_list:
            # if the message window does not exist, call it
            command = "zenity --info --title='"+window_title+"' --text='Waiting for pid "+pid+" to appear'"
            subprocess.Popen(["/bin/bash", "-c", command])
    else:
        # if the pid appeared, close the message window and break the script
        subprocess.Popen(["wmctrl", "-c", window_title])
        break
    t = t+1
    time.sleep(1)

答案2

或者直接使用 bash:

MYPID=$(pidof target) ; zenity -- info --text "Process $MYPID waiting" & wait $MYPID ; killall zenity

请注意,wait要求进程是当前shell的子进程;您可以改用原始版本。

相关内容