2012-02-24 4 views
3

리눅스에서 작업 제어와 관련하여 도움이 필요합니다.리눅스에서 작업 제어 - 터미널에 다시 제어권을주고 싶습니다.

나는 다음 백그라운드 프로세스로 실행되고이

$ ./test.elf & 

내 프로그램/과정처럼, 터미널에서 내 프로그램을 실행합니다.

잠시 후 (예 : 5 초) 나는 fg을 입력하여 프로세스를 포 그라운드에 배치합니다.

잠시 후 (예 : 5 초), 내 프로그램을 백그라운드 프로세스로 되돌리고 포어라운드 프로세스로 bash 프로그램을 넣어 터미널을 계속 사용할 수있게하려고합니다.

  1. 내 pprogram을 startng, 나는 tcgetpgrp 기능을 사용하여 전면 프로세스 (bash는 프로그램)의 그룹 프로세스 ID를 얻을 : 여기

    내가 할 것입니다.

  2. 그런 다음 프로세스가 포 그라운드 프로세스가 될 때까지 기다립니다. 나는 tcgetpgrp(STDIN__FILENO)을 사용한다.
  3. 그런 다음 ~ 5 초 기다려주십시오.
  4. tcsetpgrp을 사용하여 위의 1 번에서 설명한 프로세스를 포 그라운드에 넣습니다.

문제는 내 프로세스가 백그라운드에서 포어 그라운드의 bash 프로그램에 배치 된 것을 볼 수 있지만 터미널에 명령을 입력 할 수 없습니다. bash는 "돌아 오지 않는다", 그것은 여전히 ​​기다리고 있거나 자고있다.

은 내가 Ctrl 키 눌러 알 - Z를 다음 bg하지만 난 때문에 후 Ctrl 키 것을 사용하지 않으 - Z 내 프로세스가 정지 누르면 그 때문에 좋지 않다 "실시간"제어 응용 프로그램을 실행하고 있습니다. 따라서 프로그램을 멈추거나 일시 중지하지 않고 "즉시"터미널로 다시 전환하고 싶습니다.

내 문제에 대한 설명이 혼란 스러울 경우 죄송합니다.

의견이 있으십니까?

+1

-

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; 

는 타자의 이해이 실행 스크립트를 시도? – mouviciel

+0

네, 그게 일어날 것입니다 : 나는 (전경에서) 내 프로그램을 테스트하고 디버깅하기 위해 전용 터미널을 사용하지만, 끝나면 내 프로그램을 멈추지 않고 CTRL-Z를 누른 다음 'disown' – joeks

+0

터미널을 종료하면 어떻게 제어를 다시 되돌릴 수 있습니까? – mouviciel

답변

1

이것이 해결책이라면 100 %가 아니라는 것을 인정해야하지만 GNU Screen 유틸리티는 어떻게 사용합니까? 다른 화면에 사용 가능한 단말기가있을 때 앱은 한 화면에서 실행될 수 있습니다. 화면 간 전환은 하나의 키보드 단축키만큼 쉽습니다. GNU 화면의 문서는 here입니다.

또 다른 옵션은 disown 명령 일 수 있습니다 (내가 아는 한 Bash에서만 사용 가능). 프로세스를 백그라운드에서 실행할 수있게하고 일부 문서는 here입니다.

+0

하지만 내 프로세스가 포 그라운드에있을 때 어떻게하면 터미널에 돌아가서 'disown'을 입력 할 수 있습니까 (ctrl-z로 프로세스를 중단하지 않고)? 기본적으로 'bg'와 'fg'를 수행하지만 내 프로그램에서는 수행하려고합니다. – joeks

+0

흠, 이제는 좋은 질문입니다. 이 응용 프로그램은 출력 만 제공합니까, 아니면 대화 형입니까? 출력 만 제공하는 경우 하나의 솔루션은 잔인 함에도 불구하고 프로세스를 분기하고 명명 된 파이프를 사용하여 클라이언트와 유사한 응용 프로그램에 출력을 제공하는 것입니다. –

+0

대화 형입니다 (stdin에서 명령을 읽음). 스레드는 stdin에서 명령을 읽고 stdout에서 정보를 출력합니다. 특정 명령을 받으면 터미널을 "종료"하고 stdin, stdout을 터미널에 보내야하지만 전체 프로세스가 계속 실행되어야합니다. – joeks

0

다음과 같은 스크립트를 추가 할 수 있습니다. 당신의 백그라운드에서의 프로세스 동안 5 초 동안 터미널을 돌려 줄 것입니다.당신이 포 그라운드에서 실행중인 프로세스에 전용 터미널을 사용하지 않는 이유는 다른 터미널에 다른 사업을 할 때,

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