
터미널에서 직접 실행할 때 '&' 유무에 관계없이 잘 실행되는 응용 프로그램이 있습니다. 그러나 쉘 스크립트에서 실행하려고 하면 뒤에 오는 '&'를 건너뛰는 경우에만 작동합니다. 따라서 쉘 스크립트 내부에서 백그라운드로 이 프로세스를 시작할 수 없습니다.
<Path to My application> <options> &
응용 프로그램 창이 열리지만 그 이후에는 진행이 되지 않습니다.
(이 애플리케이션은 qemu 0.13.0의 수정된 버전입니다. 쉘 스크립트의 백그라운드에서 디스크 이미지를 실행하면 검은색 화면이 나타납니다.)
답변1
기본 제공 옵션이 있는 경우 앰퍼샌드로 애플리케이션을 배경화할 필요가 없습니다. qemu의 경우도 마찬가지입니다(제거하지 않은 경우).
% qemu-kvm --help | grep daemon
-daemonize daemonize QEMU after initializing
답변2
다음과 같은 메시지가 보이시나요?
[1] suspended (tty output) myapplication
터미널에서? 이 메시지는 프로그램이 터미널에서 읽으려고 시도하고 있음을 의미합니다(아마도 표준 입력에서 읽고 있기 때문일 것입니다). 포그라운드 프로그램만 터미널에서 읽을 수 있으므로 프로그램이 일시 중지됩니다.
이 메시지가 표시되면 프로그램이 읽고 있는 이유를 알아보세요. 필사적으로 표준 입력( myapplication </dev/null
)을 리디렉션해 보세요.
그러한 메시지가 표시되지 않으면 프로그램의 다른 버그입니다. 프로그램이 디버거나 strace
.
답변3
터미널에서 백그라운드 명령을 실행하는 것과 쉘 스크립트에서 실행하는 것에는 차이가 있습니다.
비대화형 셸(작업 제어가 비활성화된)에서 백그라운드 명령의 stdin은 암시적으로 에서 리디렉션되어 /dev/null
명령이 전혀 실행되지 않을 수 있습니다.
POSIX 표준을 참조하세요.쉘 명령 언어: 비동기 목록.
# compare where fd 0 is pointing to
sh -c 'sleep 10 & lsof -p ${!}'
sh -c 'sleep 10 0<&0 & lsof -p ${!}'
sh -c 'set -m; sleep 10 & lsof -p ${!}'
sh -ic 'sleep 10 & lsof -p ${!}'