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

Это - вероятно, простой вопрос, но я не нашел ответ нигде.

Я хочу запустить программу из сценария оболочки и затем закрыть его из сценария оболочки немного позже.

Однажды загрузки программы, сценарий зависает, потому что фокус находится теперь на открытой программе.

Как я возвращаю фокус сценарию?

0
задан 9 March 2019 в 17:48

1 ответ

Я хочу запустить программу из сценария оболочки и затем закрыть его из сценария оболочки немного позже.

Сценарии по своей природе последовательны, и любая команда, выполняемая в сценарии, который не встроен, требует создания отдельный процесс, и ожидайте того процесса для возврата управления сценарию. Существует несколько других сложных деталей, но это - основная суть того, как работают сценарии оболочки.

Теперь, то, что Вы спрашиваете, должно иметь сценарий, запускают процесс и используют тот же сценарий для закрытия процесса. Это означает, что команда должна быть независима от сценария - отдельного процесса - и знать то, что является тем процессом так или иначе. Не вдаваясь слишком много в подробности нескольких способов того, как это может быть сделано, самый практический путь состоит в том, чтобы создать a .pid файл для команды.

Например, вот сценарий, который мог сделать что-то вроде этого:

#!/bin/sh

pid_file_exists()[ -f "$1" ]
pid_file='/tmp/mycommand.pid'

# Check if file exists, which may mean the process exists
if pid_file_exists "$pid_file" ; then
    pid=$(cat "$pid_file" )
    # Replace script with kill command. This will prevent going
    # further in the script. 
    rm "$pid_file"
    exec kill $pid 
fi

# Save script's PID
echo $$ > "$pid_file"
# Replace script process with zenity, PID now
# is saved and we know it belongs to this command, not script
exec zenity --info "THIS IS A TEST"

При запуске сценария на одной терминальной вкладке, Вы будете видеть всплывающее окно, созданное zenity утилита. Если Вы запустите скрипт на другой вкладке то - это уничтожит то всплывающее окно. Теперь Вы заметите, что сценарий сохраняет контроль над терминалом на первой вкладке. Это просто, как оболочка обрабатывает работу. Таким образом в случае, если Вы хотите сделать это от того же терминала, Вы могли бы хотеть использовать также nohup или setsid управляйте для отсоединения сценария при запуске требуемого приложения. Например, для запуска использования

# &>/dev/null hides all output
setsid ./controller_script.sh &>/dev/null

и закрыть Вас может просто сделать

./controller_script.sh

Обратите внимание также, что предположение здесь - то, что Вы хотите управлять приложением с помощью сценария только. Если приложение, которым Вы хотите управлять, уже вышло (закрытый кнопкой GUI или другим процессом), Вы получите ошибку, но вот именно - никакой вред, причиненный от ошибки. Теперь, если, что PID уже принадлежит другому процессу - который мог быть проблемой, поэтому если Вы собираетесь реализовать что-то действительно портативное, Вы могли бы также добавить проверки на то, принадлежит ли процесс действительно приложению, Вы предназначили, например, через проверку /proc/$pid/cmdline файл.

1
ответ дан 26 October 2019 в 01:58

Другие вопросы по тегам:

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