Управление заданиями в Linux - Хотите вернуть управление терминалу
Мне нужна помощь относительно контроля работы в Linux.
Я запускаю свою программу из терминала, как это
$ ./test.elf &
Моя программа / процесс запускается как фоновый процесс.
Через некоторое время (скажем 5 секунд) я печатаю fg
поставить мой процесс на первый план.
Через некоторое время (скажем, 5 секунд) я хочу, чтобы моя программа вернулась к фоновому процессу и поместила программу bash в качестве процесса переднего плана, чтобы я мог продолжить использовать терминал.
Вот что я делаю:
- При запуске моей программы я получаю идентификатор группового процесса переднего плана (программа bash), используя
tcgetpgrp
функция. - Затем я жду, пока мой процесс не станет приоритетным. Я использую
tcgetpgrp(STDIN__FILENO)
, - Я тогда жду ~5 секунд
- С помощью
tcsetpgrp
Я поставил процесс, который я получил в пункте 1 выше, на первый план.
Проблема в том, что я вижу, что мой процесс находится в фоновом режиме, а программа bash - на переднем плане, но я не могу ввести команду в терминале. Баш не "возвращается", он все еще ждет или спит.
Я знаю, что могу нажать Ctrl-Z, а затем bg
но я не хочу использовать это, потому что после нажатия Ctrl-z мой процесс останавливается, и это не хорошо, потому что я запускаю управляющее приложение в режиме реального времени. Поэтому я хочу мгновенно переключиться на терминал, не останавливая и не останавливая мою программу.
Извините, если мое описание моей проблемы кажется запутанным.
Любые комментарии?
2 ответа
Я должен признать, что я не на 100%, если это решение, которое вы ищете, но как насчет использования утилиты GNU Screen? Ваше приложение может работать на одном экране, в то время как у вас есть доступный терминал на другом экране. Переключаться между экранами так же просто, как одним сочетанием клавиш. Документацию по экрану GNU можно найти здесь.
Другим вариантом может быть команда disown (насколько я знаю, она доступна только в Bash). Это позволяет вам запустить процесс в фоновом режиме, и некоторая документация находится здесь.
Вы можете добавить следующее в свой скрипт. он вернет вам терминал на 5 секунд, пока ваш процесс в фоновом режиме.
timelimit=5; ## The time limit in seconds
NEW_PROMPT_COMMAND="; if [[ \\\$SECONDS -gt $timelimit ]]; then echo \\\"---Timelimit hit, shutting down shell---\\\"; flush_keyboard_buffer; exit; fi";
touch ~/.bashrc_timelimit;
cp ~/.bashrc ~/.bashrc_timelimit;
(cat ~/.bashrc; echo -e "\nPROMPT_COMMAND+=\"$NEW_PROMPT_COMMAND\"") > ~/.bashrc_timelimit;
bash --rcfile ~/.bashrc_timelimit;
попробуйте этот скрипт для понимания теста -
function pause(){
read -n 1 -p "$*"
}
clear
until [ "selection" = "0" ] ; do
echo " "
echo -e '\t\t\t' "Unix Helper Utility"
echo -e '\t\t\t' "==================="
echo " "
echo "[1] List File names in current directory"
echo "[2] Show Time and Date"
echo "[3] Process ID"
echo "[4] Send this menu to Background"
echo "[0] Exit"
echo " "
echo "Please pick an option listed above: "
read selection
echo " "
case $selection in
1 ) clear
echo " Current Directory list:"
ls
pause
clear ;;
2 ) clear
date
pause
clear ;;
3 ) clear
echo "option 3"
pause
clear ;;
4 ) clear
timelimit=5; ## The time limit in seconds
NEW_PROMPT_COMMAND="; if [[ \\\$SECONDS -gt $timelimit ]]; then echo \\\"---Timelimit hit, shutting down shell---\\\"; flush_keyboard_buffer; exit; fi";
touch ~/.bashrc_timelimit;
cp ~/.bashrc ~/.bashrc_timelimit;
(cat ~/.bashrc; echo -e "\nPROMPT_COMMAND+=\"$NEW_PROMPT_COMMAND\"") > ~/.bashrc_timelimit;
bash --rcfile ~/.bashrc_timelimit;
clear ;;
0 ) clear
exit
esac
done