xdotool search --sync --pid "$PID"
сделает именно то, что вы хотите. Я нашел этот метод здесь
--sync - Block until there are results. This is useful when you are launching an application and want to wait until the application window is visible.
#!/bin/bash
geany &
PID=$!
if xdotool search --sync --pid "$PID" > /dev/null; then
# if window with the specific PID has appeared
# then doing something here
fi
Примечание:
Не работает с некоторыми приложениями, Netbeans
например, из-за этого:
--pid PID - Match windows that belong to a specific process id. This may not work for some X applications that do not set this metadata on its windows.
Если изменить --pid "$PID"
на --name netbeans
или --class netbeans
, это тоже работает.
Этот скрипт вычисляет задержку в миллисекундах между запуском geany &
и появлением окна geany.
#!/bin/bash
geany &
PID=$!
time_start=$(date '+%s%3N')
if xdotool search --sync --pid "$PID" > /dev/null; then
time_end=$(date '+%s%3N')
time_interval=$((time_end - time_start))
printf "%'d ms\n" "$time_interval"
fi
Выход:
$./delay_calculate.sh
553 ms
while true; do <some application>; sleep 1; done &
myloop=$! # get the pid of the child
# kill $myloop
# where/when you think you need to stop the child process
&
создает дочерний процесс в фоновом режиме. Существуют и другие команды, которые имеют дело с заданием, например fg
, которые вы, возможно, захотите рассмотреть.
То, что вам нужно в вашем скрипте, это не бесконечный цикл, а файл блокировки.
Затем вызовите сценарий, который выполняет работу внутри сценария-оболочки.
#!/bin/sh
if [ -f /tmp/.lock.my-mgr ]
then
echo "Program in use... exiting..."
exit 10
fi
/bin/touch /tmp/.lock.my-mgr
/usr/local/bin/myscript.sh
/bin/rm /tmp/.lock.my-mgr
Если вы хотите, чтобы эта задача выполнялась пакетом каждые несколько минут, запланируйте это с помощью cron.
Редактировать:
PID сценария, работающего с циклом, может быть помещен в файл с чем-то вроде
echo $! > /var/tmp/script1.pid
(одним шрифтом ).
Чтобы проверить, запущен ли он из второго скрипта, используйте команду ps, что-то вроде
ps -p `cat /var/tmp/script1.pid`
, а затем проверить его статус с помощью $? переменная, которая должна быть равна 0, если ps нашел этот pid, или 1, если нет. Это базовая логика, но ее можно было бы написать с лучшими тестами, например, на случай, если файл pid не существует.