myscript: cannot create temp file for here-document: No space left on deviceそのスクリプトではヒアドキュメントを使っており、メッセージから察するに、bash のヒアドキュメントでは、背後で一時ファイルが作られるらしい、と認識しました。考えてみると自然な実装であり「まあそうなるわなあ」という感想。
いちおう確かめるために、そのスクリプトのエッセンスを抽出して実験してみました。
#!/bin/bash perl <<'PERL' exit 0 PERL
[root@hoge ~]# uname -a Linux hoge 3.10.0-957.12.2.el7.x86_64 #1 SMP Tue May 14 21:24:32 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux [root@hoge ~]# rpm -q bash bash-4.2.46-31.el7.x86_64 [root@hoge ~]# diff -c test1 test2 *** test1 2019-06-21 23:38:42.812280355 +0900 --- test2 2019-06-21 23:39:56.797172798 +0900 *************** *** 1,4 **** #!/bin/bash ! perl <<'PERL' exit 0 ! PERL --- 1,4 ---- #!/bin/bash ! perl -e ' exit 0 ! ' [root@hoge ~]# strace -o /tmp/strace.out -f ./test1 ※ヒアドキュメントを使用した場合 [root@hoge ~]# strace -o /tmp/strace.out2 -f ./test2 [root@hoge ~]# grep /tmp/ /tmp/strace.out 86704 open("/tmp/sh-thd-1561087024", O_WRONLY|O_CREAT|O_EXCL|O_TRUNC, 0600) = 3 86704 open("/tmp/sh-thd-1561087024", O_RDONLY) = 4 86704 unlink("/tmp/sh-thd-1561087024") = 0 [root@hoge ~]# grep /tmp/ /tmp/strace.out2 ※ヒアドキュメントを使用しない場合は出力なし [root@hoge ~]# wc -l /tmp/strace.out* 402 /tmp/strace.out 393 /tmp/strace.out2 795 合計strace の出力から、bash のヒアドキュメントは、一時ファイルを作成すると確認できました。この例の場合は、ヒアドキュメントをやめて perl -e '...' と書き換えれば、一時ファイル作成を避けることができました。全体のシステムコール数も減りました。
せこいようですが、「塵も積もれば山となる」という場合もあるものと思います。
0 件のコメント:
コメントを投稿