Это - вероятно, простой вопрос, но я не нашел ответ нигде.
Я хочу запустить программу из сценария оболочки и затем закрыть его из сценария оболочки немного позже.
Однажды загрузки программы, сценарий зависает, потому что фокус находится теперь на открытой программе.
Как я возвращаю фокус сценарию?
Я хочу запустить программу из сценария оболочки и затем закрыть его из сценария оболочки немного позже.
Сценарии по своей природе последовательны, и любая команда, выполняемая в сценарии, который не встроен, требует создания отдельный процесс, и ожидайте того процесса для возврата управления сценарию. Существует несколько других сложных деталей, но это - основная суть того, как работают сценарии оболочки.
Теперь, то, что Вы спрашиваете, должно иметь сценарий, запускают процесс и используют тот же сценарий для закрытия процесса. Это означает, что команда должна быть независима от сценария - отдельного процесса - и знать то, что является тем процессом так или иначе. Не вдаваясь слишком много в подробности нескольких способов того, как это может быть сделано, самый практический путь состоит в том, чтобы создать 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
файл.