"&"가 있든 없든 터미널에서 직접 실행할 때 잘 실행되는 응용 프로그램이 있습니다. 그러나 쉘 스크립트에서 실행하려고 하면 뒤에 오는 "&"를 건너뛰는 경우에만 작동합니다. 따라서 쉘 스크립트 내부에서 백그라운드로 이 프로세스를 시작할 수 없습니다.
<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 ${!}'