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 件のコメント:
コメントを投稿