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