2017-12-18 25 views
0

파일로 압축을 풀고 추가로 처리해야하는 매우 큰 아카이브가 있습니다. 나는 전체 아카이브 (RAM이나 플래시가 아님)를 추출하기에 충분한 메모리가 없다. 따라서 추출 된 각 파일 이후에 (raise(SIGSTOP)) 작은 프로그램을 작성했다. 동등한이 코드 수 :스크립팅 할 때 SIGSTOP이 작동하지 않습니다.

#include <stdio.h> 
#include <signal.h> 

int main() { 
    printf("started.\n"); fflush(stdout); 
    sleep(2);        // extracting archive 
    printf("stopping\n"); fflush(stdout); 
    raise(SIGSTOP);      // stopping 
    printf("resume + done\n"); fflush(stdout); 
    return 0; 
} 

내가 터미널이 실행하면서 잘 작동 :

$ gcc -o dosleep main.c 
$ ./dosleep 
started. 
stopping 

[1]+ Stopped     ./dosleep 
$ fg 
./dosleep 
resume + done 
$ 

그러나 스크립트에서 메서드를 호출 할 때, 명령이 결코 반환 :

$ cat doit.sh 
#!/bin/sh 
echo "STARTING" 
./dosleep 
echo "BACK" 
$ ./doit.sh 
STARTING 
started. 
stopping 

^C^C^C^C^C^C 

왜 터미널과 스크립트가 다르게 동작합니까? 이 동작을 변경하는 방법이 있습니까?

덕분에, 칼

답변

1

작업 제어는 오프 - 기본적으로 비대화 껍질에,하지만 당신은 명시 적으로 활성화 할 수 있습니다

set -m 

을 따라서, 우리는 어느 set -m 라인을 추가 할 수있는 스크립트를 수정하는 경우 또는 당면한에 -m는 다음과 같이

#!/bin/bash -m 
./start-delay 
echo BACK 

...은 다음 BACKstopping 후에 방출된다. bash는 남자 페이지 section on set에서 인용


는, 강조는 추가 :

-m 모니터 모드. 작업 제어가 사용됩니다. 이 옵션은 기본적으로 대화 형 쉘을 지원하는 시스템에서입니다 (위의 작업 참조). 모든 프로세스는 별도의 프로세스 그룹에서 실행됩니다. 백그라운드 작업이 완료되면 쉘은 종료 상태를 포함하는 행을 인쇄합니다.

+0

감사합니다 - busybox 셸에서도 작동합니다! – Charly

+0

login 쉘에서 스크립트를 호출 할 때'setsid sh -c 'myscript.sh Charly

+0

@Charly, ... 글쎄, "TTY없이 어딘가에서"로 "로그인 쉘에서"아닙니다. 두 개는 다소 직교합니다. TTY가없는 로그인 쉘 또는 로그인 쉘이없는 TTY를 가질 수 있습니다. –