シェルスクリプトでメタプログラミングをするときは気を付けるべき
from Cannot fork
シェルスクリプトでメタプログラミングをするときは気を付けるべき
プロセスの終了を待たないままジョブ(プロセス)を起動すると普通に死んでしまう
この例ではファイルを大量に作成する悪い例
code:00_init.sh
#!/usr/bin/env bash
n=100000
m=$(($n-1))
tempfile=mktemp
paste -d' ' <(yes printf '"bin/%06d.bin\n"' | head -n "$n") <(seq 0 "$m") | sh - > "$tempfile"
paste -d' ' <(yes touch | head -n "$n") <(cat "$tempfile") <(yes '&')
rm "$tempfile"
実行
code:sh
./shellscripts/00_init.sh | sh - &
ファイル数を監視してると、大体70827くらいでsh: 0: Cannot forkが表示され止まる
code:sh
watch -n1 'find ./bin -type f | wc'
ちなみに正解はseq(1)のフォーマット機能を使う方法
code:sh
n=99999
seq -f "bin/%06g.bin" 0 $n | xargs touch