Ждите PID - показано в пс
Я использую приведенную ниже команду в скрипте, чтобы дождаться PID, а затем сделать что-то, когда этот процесс завершится: while ps -p [pid] > /dev/null; do sleep 1; done; [cmd]
где [pid] - это PID запущенного процесса, а [cmd] - команда, которую я хочу выполнить после его завершения. Теперь мой вопрос заключается в следующем: есть ли способ увидеть, что мой процесс (сценарий) ожидает процесса [pid] с помощью команды, такой как ps или что-то еще?
2 ответа
Используя Zenity
Что относительно легко сделать, так это:
- генерировать
Zenity
сообщение о том, что ваш скрипт ожидает появления pid. Окно будет автоматически закрыто, если в выводе появится pid
ps -p <pid>
,ps -e
или любой другойps
Команда запускается по сценарию.
пример
Ниже приведена процедура, как это можно сделать.
я использую python
в этом примере вы можете либо реализовать его для bash, либо (почему бы и нет) просто использовать скрипт python и запустить его с вашим pid в качестве аргумента.
Принцип
- В цикле скрипт проверяет, есть ли pid в выводе (в моем примере)
ps -e
Если нет, скрипт вызывает
Zenity
окно, упомянув, что вы ждете пидпримечание: скрипт также проверяет,
Zenity
окно уже существует, с помощью команды:wmctrl -l
который перечисляет все окна. Если бы мы не включили этот шаг, вы бы разбежались с всплывающими окнами...
Команда для вызова
Zenity
окно:zenity --info --title='pid-message' --text='Waiting for pid to appear'
Как только пид появится в
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)
Или просто из bash:
MYPID=$(pidof target) ; zenity -- info --text "Process $MYPID waiting" & wait $MYPID ; killall zenity
Обратите внимание, что ожидание требует, чтобы процесс был дочерним по отношению к текущей оболочке; вместо этого вы можете использовать свою оригинальную версию.