저는 Linux 쉘 스크립팅을 처음 접했고 다음 스크립트를 작성했습니다.
스크립트는 정상적으로 실행되지만 프로그램이 완료되고 프로그램이 완료되었다는 메시지가 표시된 후에 명령줄 프롬프트를 표시하려면 키보드에서 수동으로 [ENTER]를 눌러야 합니다. 내 스크립트가 왜 이렇게 작동합니까?
하위 프로세스가 완료되고 스크립트 에코 프로그램이 완료되었을 때 제어가 명령줄로 돌아가고 명령줄 프롬프트를 표시하기 위해 아무 것도 할 필요가 없도록 하려면 어떻게 해야 합니까?
#!/bin/ksh
echo "program running..."
funcall(){
nohup <<command_name>> $program >/dev/null 2>&1
pid = $!
wait pid
echo "program completed..."
exit
}
fork(){
funcall &
}
fork
답변1
분기된 프로세스가 자체적으로 기다리는 것은 매우 드문 일입니다.
제어 흐름은 다음과 같아야 합니다.
- 포크 프로세스
- 하위 프로세스가 해당 작업을 수행합니다.
- 부모는 할 일을 하고 기다린다
이것은 다음과 같이 번역됩니다.
#!/bin/ksh
echo "program running..."
funcall () {
nohup some_command "$program" >/dev/null 2>&1
echo "program completed..."
}
fork () {
funcall &
}
fork
child_pid="$!"
wait "$child_pid"
이 경우 함수가 실행되는 동안 아무 작업도 수행하지 않기 때문에 호출 배경 funcall
과 함수 호출이 반환되기를 기다리는 것은 완전히 불필요합니다 fork
.funcall
코드가 하는 일은 백그라운드에서 하위 쉘을 실행하고 즉시 상위 쉘에 제어권을 반환하는 것뿐입니다. 스크립트 출력으로 인해 프롬프트가 약간 혼란스러울 수 있습니다.
스크립트에 몇 가지 오류도 있습니다.
pid
변수로 사용되지만 이어야 합니다$pid
.- 할당된 대상
pid
주위에는 공백이 없어야 합니다=
.
또한 exit
필요하지 않습니다.
귀하의 요구 사항을 충족하는 간단한 스크립트는 다음과 같습니다.
#!/bin/ksh
echo "program running..."
nohup some_command "$program" >/dev/null 2>&1
echo "program completed..."
답변2
프로세스가 완료되면 이미 명령 프롬프트에 있지만 프롬프트 자체는 스크립트의 배경 부분의 출력으로 인해 가려집니다.
Enter를 누르면 명령줄에 입력한 명령(아무 것도 없을 수도 있음)이 실행되고 "복구 프롬프트"처럼 나타나는 프롬프트가 다시 인쇄됩니다.
잘못된 출력 후 화면을 정리하려면 Ctrl-L을 누르십시오.
답변3
코드를 다음에서 변경하세요. funcall&
도착하다funcall
. funcall
백그라운드에서 실행 중이므로 상위 프로세스는즉. 당신의 스크립트하위 프로세스가 완료되기를 기다리는 중입니다.
funcall을 포그라운드에서 실행하면 프로그램이 정상적으로 종료됩니다.