Как я могу остановить встроенный фоновый процесс, когда мой основной скрипт останавливается?

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

1
12.07.2019, 19:39
2 ответа
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, которые вы, возможно, захотите рассмотреть.

0
27.01.2020, 23:41

То, что вам нужно в вашем скрипте, это не бесконечный цикл, а файл блокировки.

Затем вызовите сценарий, который выполняет работу внутри сценария-оболочки.

#!/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 не существует.

1
27.01.2020, 23:41

Теги

Похожие вопросы