Ich habe ein wirklich großes Archiv, das Datei für Datei extrahiert und weiterverarbeitet werden muss. Ich habe nicht genügend Speicher, um das gesamte Archiv zu extrahieren (weder im RAM noch auf dem Flash) - also habe ich eine kleine Anwendung geschrieben, die nach jeder extrahierten Datei stoppt (raise(SIGSTOP)
). Ein Äquivalent könnte dieser Code sein:SIGSTOP funktioniert nicht, wenn Skript
#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;
}
Dies funktioniert gut, während ich dies im Terminal ausführen:
$ gcc -o dosleep main.c
$ ./dosleep
started.
stopping
[1]+ Stopped ./dosleep
$ fg
./dosleep
resume + done
$
Aber wenn das Verfahren aus einem Skript aufrufen, gibt der Befehl nie:
$ cat doit.sh
#!/bin/sh
echo "STARTING"
./dosleep
echo "BACK"
$ ./doit.sh
STARTING
started.
stopping
^C^C^C^C^C^C
Warum verhalten sich Terminal und Skript so unterschiedlich? Gibt es eine Möglichkeit, dieses Verhalten zu ändern?
Danke, Karl
danke - funktioniert auch in der busybox shell! – Charly
Wenn Sie das Skript nicht aus der Login-Shell aufrufen, müssen Sie es mit 'setsid sh -c 'myscript.sh dev/tty1'' starten, sonst erhalten Sie' Kann nicht auf tty zugreifen; Jobsteuerung ausgeschaltet " – Charly
@Charly, ... nun, nicht so sehr" nicht von der Login-Shell "als" von irgendwo ohne TTY ". Die beiden sind etwas orthogonal - es ist möglich, eine Login-Shell ohne TTY oder eine TTY ohne Login-Shell zu haben. –