Управление заданиями в Linux - хотите вернуть управление терминалу - PullRequest
3 голосов
/ 24 февраля 2012

Мне нужна помощь относительно контроля работы в Linux.

Я запускаю свою программу из терминала, как это

$ ./test.elf &

Моя программа / процесс запускается как фоновый процесс.

Через некоторое время (скажем, 5 секунд) я набираю fg, чтобы поставить мой процесс на передний план.

Через некоторое время (скажем, 5 секунд) я хочу, чтобы моя программа вернулась к фоновому процессу и поместила программу bash в качестве процесса переднего плана, чтобы я могла продолжить использовать терминал.

Вот что я делаю:

  1. При запуске моей программы я получаю идентификатор группового процесса переднего плана (программы bash), используя функцию tcgetpgrp.
  2. Затем я подожду, пока мой процесс не станет приоритетным. Я использую tcgetpgrp(STDIN__FILENO).
  3. Я тогда жду ~ 5 секунд
  4. Используя tcsetpgrp, я поставил процесс, который я получил в пункте 1 выше, на передний план.

Проблема в том, что я вижу, что мой процесс находится на заднем плане, а программа bash на переднем плане, но я не могу ввести команду в терминале. Баш не «возвращается», он все еще ждет или спит.

Я знаю, что могу нажать Ctrl - z , а затем bg, но я не хочу использовать это, потому что после Ctrl - z нажата, мой процесс остановлен, и это не хорошо, потому что я запускаю управляющее приложение в режиме реального времени. Поэтому я хочу немедленно вернуться к терминалу, не останавливая и не останавливая мою программу.

Извините, если мое описание моей проблемы кажется запутанным.

Есть комментарии?

Ответы [ 2 ]

1 голос
/ 24 февраля 2012

Я должен признать, что я не на 100%, если это решение, которое вы ищете, но как насчет использования утилиты GNU Screen?Ваше приложение может работать на одном экране, в то время как у вас есть доступный терминал на другом экране.Переключаться между экранами так же просто, как одним сочетанием клавиш.Документацию по экрану GNU можно найти здесь .

Другой вариант - команда disown (насколько я знаю, она доступна только в Bash).Он позволяет вам запустить процесс в фоновом режиме, и некоторая документация находится здесь .

0 голосов
/ 24 февраля 2012

вы можете добавить следующее в ваш скрипт. он вернет вам терминал на 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
...