파일로 압축을 풀고 추가로 처리해야하는 매우 큰 아카이브가 있습니다. 나는 전체 아카이브 (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
왜 터미널과 스크립트가 다르게 동작합니까? 이 동작을 변경하는 방법이 있습니까?
덕분에, 칼
감사합니다 - busybox 셸에서도 작동합니다! – Charly
login 쉘에서 스크립트를 호출 할 때'setsid sh -c 'myscript.sh dev/tty1''로 시작해야합니다. 그렇지 않으면'tty에 액세스 할 수 없습니다. 작업 제어가 꺼져 있습니다. – Charly
@Charly, ... 글쎄, "TTY없이 어딘가에서"로 "로그인 쉘에서"아닙니다. 두 개는 다소 직교합니다. TTY가없는 로그인 쉘 또는 로그인 쉘이없는 TTY를 가질 수 있습니다. –