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のmanページsection on setから引用


、重点が追加さ:

-mモニタモードを。ジョブ制御が有効になっています。 このオプションは、それをサポートするシステム上の対話シェルのデフォルトでは、です(上記のJOB CONTROLを参照)。すべてのプロセスは、別々のプロセスグループで実行されます。バックグラウンドジョブが完了すると、シェルは終了ステータスを含む行を出力します。

+0

thanks - busyboxシェルでも動作します。 – Charly

+0

ログインシェルからスクリプトを呼び出すときに 'setsid sh -c 'myscript.sh Charly

+0

@Charly、...「TTYなしの場所から」というように「ログインシェルからではありません。 2つは幾分直交しています - TTYを持たないログインシェル、またはログインシェルのないTTYを持つことは可能です。 –

関連する問題