X



シェルスクリプト総合 その37

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
垢版 |
2021/10/05(火) 22:49:30.91ID:KsbWuyFp
シェルスクリプトに関する総合スレッドです。

全般
・荒しは無視しましょう。
・丁寧な姿勢を心掛けましょう。
・ネチケット(死語)を意識しましょう。
・「○○(他の言語)でいいやん」は禁止。他のスレに行ってください。
・「POSIX原理主義」「ユニケージ」「USP研究所」はPOSIXとUnixを曲解し
間違ったシェルスクリプトを広めている宗教です。洗脳されないようにしてください。

前スレ: シェルスクリプト総合 その36
https://mevius.5ch.net/test/read.cgi/tech/1614212414/

関連スレ
・【Bash】Windows Subsystem for Linux【WSL】11
https://mao.5ch.net/test/read.cgi/linux/1627507889/
・Bashでプログラミング [転載禁止](c)2ch.net
https://mao.5ch.net/test/read.cgi/linux/1443885102/
・シェルスクリプト総合 その28
https://mevius.5ch.net/test/read.cgi/unix/1533154936/
・zsh その7
https://mevius.5ch.net/test/read.cgi/unix/1337844883/
・過去UNIXで使われていた ksh というシェルについて
https://mevius.5ch.net/test/read.cgi/unix/1582358403/
・【POSIX】UNIXプログラミング【BSD】 [転載禁止](c)2ch.net
https://mevius.5ch.net/test/read.cgi/unix/1443103705/
・おまえら! shell は何を使っているんですか?
https://mevius.5ch.net/test/read.cgi/unix/1012330865/
0428デフォルトの名無しさん
垢版 |
2021/12/29(水) 17:29:01.73ID:wwN1RbRp
Linuxはホットパッチが売りなので。
0432デフォルトの名無しさん
垢版 |
2021/12/29(水) 18:01:34.74ID:o6aVS5Lj
inode云々は問題の表層でしかない
実行中のスクリプトが新しくなったからといって77TBものユーザーデータをサクッと削除しちゃえるのがおかしい
何重にもガードできているのが当たり前の案件
0435デフォルトの名無しさん
垢版 |
2021/12/29(水) 21:10:55.07ID:t8aruUm+
スパコン系の人達は運用周りのリテラシーすごく低い
シェルスクリプトしか知らない人達よりもひどいくらい
0439デフォルトの名無しさん
垢版 |
2021/12/30(木) 01:25:09.88ID:TO85sxcb
log4jで消そう
0440デフォルトの名無しさん
垢版 |
2021/12/30(木) 01:49:09.54ID:wfs2tbs7
perlのワンライナーでやるべき
0444デフォルトの名無しさん
垢版 |
2021/12/30(木) 02:25:12.29ID:IL1LVlOR
>>426
bashに限らずevalが使えるスクリプト言語はどれも似たようなもの
その方が効率がいいから

ファイルを全部メモリに読み込んでたらメモリの無駄遣い。必要になった時に読み込んで
コンパイルして中間コードをメモリに保存したほうが効率がいい

書き換えたところから実行する仕様とかじゃなくて
読み込み中にファイル内容が書き換わっただけ
0445デフォルトの名無しさん
垢版 |
2021/12/30(木) 05:20:47.81ID:jspnt6Wc
#!/bin/sh
{
# Your stuff goes here
exit
}

って書くと、全部読み込んでから実行する…らしい。
0446デフォルトの名無しさん
垢版 |
2021/12/30(木) 05:51:55.73ID:W4YtctsR
>>444
> bashに限らずevalが使えるスクリプト言語はどれも似たようなもの

知らんけどJK、PerlもRubyも違うやろ。。。
0447デフォルトの名無しさん
垢版 |
2021/12/30(木) 05:57:08.73ID:jspnt6Wc
>>446
REPL(Read-Eval-Print Loop)が使えるスクリプト言語あたりが妥当?
0448デフォルトの名無しさん
垢版 |
2021/12/30(木) 06:03:55.94ID:IL1LVlOR
>>446
検証してないけどPerlとPHPも同じらしい

それに厳密に言えばRubyでスクリプトを起動している途中で
gemsをアップデートしたらおかしくなる可能性があるやろ?
今から読み込もうとしたライブラリファイルが
中途半端に入れ替わってる可能性がある

シェルスクリプトは1ファイルの中で中途半端に
読み込まれて実行されてる可能性があるが
他のスクリプト言語は、それはないかもしれないけど
複数のファイルで構成されてる場合、中途半端に読み込まれて
実行されてる可能性がある

そしてバイナリでも動的にライブラリを読み込むようなものがあれば
同じようなことになる可能性がある
0449デフォルトの名無しさん
垢版 |
2021/12/30(木) 06:43:40.02ID:QArx8wCq
動的なのがあれば、な・・・
0450デフォルトの名無しさん
垢版 |
2021/12/30(木) 09:02:46.96ID:InFuAQoQ
こういう面倒なことになるからWindowsはアップデートの時に再起動が必要な仕様にしたんだよね
0451デフォルトの名無しさん
垢版 |
2021/12/30(木) 09:39:47.43ID:rDu++FLs
ツッコミどころが多すぎるんだよなぁ

しいて他山の石とするなら
findの結果を直で削除せず
チェックしてから削除したほうがいいってことくらいかな
0452デフォルトの名無しさん
垢版 |
2021/12/30(木) 09:58:18.91ID:uV4Ti94h
>>448
よほど特殊なケースを除いて
RubyやPythonでは同じ問題は発生しないよ
かと言って実行中に上書きはしないけどな
0453デフォルトの名無しさん
垢版 |
2021/12/30(木) 10:30:47.99ID:IL1LVlOR
>>451
突っ込みどころが多いのはお前だろ
どうやってシェルスクリプトでfindの結果をチェックして削除済んだよ
しかもそのチェックコードすら書き換わるって話だろ
何が問題になってるのかわかってない
0457デフォルトの名無しさん
垢版 |
2021/12/30(木) 12:07:43.56ID:WfZiLBBo
>>448
>それに厳密に言えばRubyでスクリプトを起動している途中で
>gemsをアップデートしたらおかしくなる可能性があるやろ?

そういう運用を前提にするなら起動途中にgemをアップデートしてもおかしくならないように作ればいい
0461デフォルトの名無しさん
垢版 |
2021/12/30(木) 13:07:53.94ID:W4YtctsR
>>450
Linuxは、実は再起動が必要なときでも、システムがそれを認知しないだけやったりするからな。。。
考えてみると、システムのsoファイルを更新しまくっても再起動不要なのはヤバいやろ。w
0462デフォルトの名無しさん
垢版 |
2021/12/30(木) 13:58:37.21ID:A3EHubzP
とりあえず手持ちの(Ubuntu20.04のデフォルト)環境だと

testと表示される
```
#!/bin/sh
echo echo test >> $0
```

testと表示される
```
#!/bin/sh
{
echo echo test >> $0
}
```

testと表示されない
```
#!/usr/bin/python3
import sys
with open(sys.argv[0], "a")as f:
f.write("print('test')")
```

/bin/sh はファイルを展開したまま参照してるけど、
/usr/bin/python3 は一度どっかにコピー(構文解析済みキャッシュ)してるから実行中の上書きが反映されない感じだと思う
0463デフォルトの名無しさん
垢版 |
2021/12/30(木) 16:24:30.20ID:W4YtctsR
>>458
いいや、閉じ括弧の後、EOFを検出する前(要はブロック実行中)に行が追加されるリスクがあるやろ。
リスクを心配したいんかしたないんか、どっちやねん?w
0464デフォルトの名無しさん
垢版 |
2021/12/30(木) 17:21:00.62ID:p57leh5q
>>453
君のところでは実行中に直接上書きするのが当たり前なの?
うちではそんなことしないから考慮する必要ないんだよね

削除に至るまでのセーフガードが他にもいくつかあるからあえて教訓を得るなら削除前のチェックかなって話
0465デフォルトの名無しさん
垢版 |
2021/12/30(木) 18:18:54.05ID:QArx8wCq
プログラム上書きで動作を変えられるというのは、ある意味脆弱性と言えるかな
権限奪われた後でしか起こせないけど
0466デフォルトの名無しさん
垢版 |
2021/12/30(木) 18:28:25.88ID:QArx8wCq
Perlとかはプログラム全部読んでから内部コードにコンパイルしてからそれを実行するので動的な部分以外は大丈夫だと思う
Perl で動的というと eval に文字列引き渡した場合と require でソース読んだ場合かな
シェルで言うと eval とドットや soure でのソース読み込み
0467デフォルトの名無しさん
垢版 |
2021/12/30(木) 22:04:38.94ID:vZc7D3zM
>>443
説明が足りないんじゃない?
単一のシェルスクリプトの場合は、更新時にinodeが変わってれば大丈夫。で終わり。

シェルスクリプトから、別のシェルスクリプトを読んでる場合は、
読み込む行でpathを評価するから、
読み込むシェルスクリプトだけが新しくなって、読み出し元シェルスクリプトが環境変数を持たない結果、同じ事象が発生する可能性はある。

だから、
installを使ったからと言って、すべてのトラブルを避けられるわけではない
と言うのであれば妥当
0469デフォルトの名無しさん
垢版 |
2021/12/31(金) 00:01:34.88ID:tL7Nlh3I
>>459
スクリプト系は実行中にロードするんだよ
該当の行まで実行しないとgemsが読み込まれない
実行前に全てのライブラリを読み込むわけではない
0470デフォルトの名無しさん
垢版 |
2021/12/31(金) 00:02:22.53ID:tL7Nlh3I
>>463
> いいや、閉じ括弧の後、EOFを検出する前(要はブロック実行中)に行が追加されるリスクがあるやろ。
{
  exit
}

閉じカッコの後が実行されるとでも思ってんの?
0471デフォルトの名無しさん
垢版 |
2021/12/31(金) 00:03:22.20ID:tL7Nlh3I
>>467
installはcpと同じ挙動をするんだから
解決策になってないって言ってるんだが理解してるか?
0472デフォルトの名無しさん
垢版 |
2021/12/31(金) 00:03:51.43ID:tL7Nlh3I
>>466
> Perlとかはプログラム全部読んでから内部コードにコンパイルしてからそれを実行するので動的な部分以外は大丈夫だと思う
PerlとPHPはシェルと同じ問題がある
調べてから書き込め
0473デフォルトの名無しさん
垢版 |
2021/12/31(金) 00:05:13.58ID:tL7Nlh3I
>>464
お前何の話してんの?

> findの結果を直で削除せず
> チェックしてから削除したほうがいいってことくらいかな

が意味不明って言ってるだけやろ
0475デフォルトの名無しさん
垢版 |
2021/12/31(金) 00:15:48.12ID:K3Q5NoN0
ティム・クックCEOとのランチには5,500円ではなく5,500万円以上必要!

Appleのティム・クックCEOとのランチをする権利のチャリティーオークションが終了しました。
結果は51,500ドル以上(約5,500万円以上)で落札されたそうです。
このオークション、落札者にはティム・クックCEOとランチができる権利とAppleイベントの
基調講演に参加できるVIPパス2枚がついてきます。
2013年は約6,200万円、2014年は約3,300万円、2015年は約2,400万円で落札されていました。
今回は約5,500万円なので高値で落札されていますね。
しかしお高いランチ代。いったい誰が落札したんでしょうか。
0477デフォルトの名無しさん
垢版 |
2021/12/31(金) 00:56:01.88ID:QVDmbS0E
>>471
installについてだけ突っ込んでるけど、
文書の本質は、inodeか変わる場合は、という意味で話してるのは理解してるか?

mvで上書きするとinode変わると信じてるけど、
installつかったすべての状況で、inode変わるかまでは分からないから、
installを例に挙げたのが悪かったのは認める。
0478デフォルトの名無しさん
垢版 |
2021/12/31(金) 01:01:12.81ID:tL7Nlh3I
だーかーらーinstall使っても
inodeは変わらないって言ってんだろ
信じてるとかじゃなくて、ちゃんと調べろ
0480デフォルトの名無しさん
垢版 |
2021/12/31(金) 01:19:12.98ID:tL7Nlh3I
>>479
これのどこにinstall以外の本質の話が書いてあるんだアホか?

441 名前:デフォルトの名無しさん[sage] 投稿日:2021/12/30(木) 02:02:44.37 ID:bPzpLvLZ [1/2]
>>425
installコマンドを使わないバカが多いからなあ
0481デフォルトの名無しさん
垢版 |
2021/12/31(金) 02:12:06.87ID:FGQbYFO9
>>469
実行中に別モジュールをロードするんであって、スクリプト自身は構文木にコンパイル済み。
>>444にはほとんど関係のない話。

シェルスクリプトには実行エラーしかないけど、Perlとかは実行前にシンタックスエラーになるのはなぜだと思うの?w
0482デフォルトの名無しさん
垢版 |
2021/12/31(金) 02:37:27.40ID:JipSLIiO
https://stackoverflow.com/questions/21096478/overwrite-executing-bash-script-files

The { forces the shell to read at least through the matching } in order to properly parse the command, and the exit then makes sure it'll never try to execute anything that gets added after that }.

BTW, I was testing this with bash version 3.2.48(1)-release (on OS X 10.8.5); other versions may behave differently...

UPDATE: Other versions do indeed behave differently. I tried the same test with version 4.3.0(1)-release (under NetBSD 6.1.4), and it continued to run the old code after the file's contents had been replaced. Apparently it now buffers the file in 8KB blocks (see this unix.se answer).
0483デフォルトの名無しさん
垢版 |
2021/12/31(金) 02:50:56.77ID:JipSLIiO
Under bash 5..0.3(1)-release on linux, it reads in 8KB blocks... but this doesn't prevent the error (in the version without the {}s), because, after the sleep is done, it seeks back to the position in the file just after the sleep! Strange behavior. {}s still protect it, good answer.
0485デフォルトの名無しさん
垢版 |
2021/12/31(金) 14:35:36.48ID:fEOKhR13
お前は { ...; exit;} での対策が無効と思ってるのか?
それともそんな面倒なこと徹底できるわけないと思ってるのか?
0486デフォルトの名無しさん
垢版 |
2021/12/31(金) 15:21:35.07ID:3oIZShwK
>ファイルを全部メモリに読み込んでたらメモリの無駄遣い
メモリの無駄遣いじゃなかったの?
0487デフォルトの名無しさん
垢版 |
2021/12/31(金) 15:44:50.78ID:tL7Nlh3I
>>484
え?どこが非現実的なんだ?
お前のキーボードでは}が打てないとかそういう話か?

{
お前のコード
exit
}
0489デフォルトの名無しさん
垢版 |
2021/12/31(金) 15:46:40.16ID:tL7Nlh3I
例えばコメントとかメモリに置いておく必要はないよな
空白もそのままメモリに保持するのはメモリの無駄遣いでしかない
0491デフォルトの名無しさん
垢版 |
2021/12/31(金) 16:59:46.95ID:fEOKhR13
bashスクリプトは実行完了するまでスクリプトファイルをcloseしないでしょ

内部形式の変換だが知らんがコピーした分だけ余計メモリに使うから >>488 以降は同意できん
0493デフォルトの名無しさん
垢版 |
2021/12/31(金) 21:34:32.21ID:tL7Nlh3I
>>491
> コピーした分だけ余計メモリに使うから
何をコピーするんだよw
まさか起動中はメモリを解放できないとか思ってるのか?
0495デフォルトの名無しさん
垢版 |
2022/01/01(土) 01:34:30.30ID:X6UBQb83
>>494
自分でわからないって言っただろ
わからないなら、自分で勉強するか
わからない所を具体的に聞け
ちゃんと教えてやるぞw
0496デフォルトの名無しさん
垢版 |
2022/01/01(土) 01:48:54.59ID:X6UBQb83
まあ俺は優しいから教えてやろうw

{ echo '#!/bin/sh'; printf '#%100s\n' {1..1000000}; echo sleep 30; echo end; } > scr.sh

これで100MBぐらいのシェルスクリプトができる
これを実行しても3MBぐらいしかメモリは食わない
内部形式は小さいからだ

これを全部メモリに蓄えておくと100MB以上消費する
最初にパースして内部形式にする方式は
後ろにバイナリとかがついている時ににエラーになるから使えない
0497デフォルトの名無しさん
垢版 |
2022/01/01(土) 02:25:58.45ID:4YArnW91
ヤバいww マジもんのアホの子だったwww
0498デフォルトの名無しさん
垢版 |
2022/01/01(土) 02:34:27.52ID:C+d3qbg4
{ echo '#!/bin/sh'; echo '{'; printf 'printf %s\n' {1..1000000}; echo sleep 30; echo '}'; } > scr.sh

「内部形式は小さいからだ」wwwww
0499デフォルトの名無しさん
垢版 |
2022/01/01(土) 02:37:31.29ID:MVIeZ8kP
echo "あけおめ $(TZ=Asia/Tokyo date +%Y)"
0500デフォルトの名無しさん
垢版 |
2022/01/01(土) 03:08:50.88ID:IS6zNVE1
今回のケースって世代バックアップとかやってたとしても
それを掴んでたバックアップスクリプト自体が上書きされて暴走して余計なファイルまで全消ししたわけだよね
>実行中のスクリプトが存在している状態でスクリプトの上書きによりリリースしてしまった
問題はここだけだと思うんだけど
酷く杜撰な運用に見える
*nix使いってこの程度のITリテラシーしかないんだね
気持ち悪い
0501デフォルトの名無しさん
垢版 |
2022/01/01(土) 04:56:33.89ID:eqRzM57+
>>500
本気でやったら、金も時間もかなりかかりそうやからなあ。
やらかしでしかないんでいいわけのしようもないんやろけど、そこはあんまり重視してなかったんやろ。
0503デフォルトの名無しさん
垢版 |
2022/01/01(土) 09:27:14.46ID:xOGFhMUK
>>501
実行中なら中断するか終了を待ってから新しいのをリリースすればいいだけだろ
日次バッチを中断したり終了を待つのに金も時間もかなりかかるのかい?

他にも例えば権限管理をまともにしてれば防げたよね?
0504デフォルトの名無しさん
垢版 |
2022/01/01(土) 10:19:02.42ID:EsvsX5UV
>>500
バックアップ容量が多いと、書き込み先の書き込み速度以上のスピードはでないから、
複数世代バックアップするにも、ずっーとバックアップというかコピーというかの処理をし続けることになる。
月次フルバックアップ処理中に、次の増分バックアップ処理が始まるのはテープの場合はよくある。

今回は復元不能と言っていることから過去のバックアップも消えてそうでD2Dっぽいけど、
そういう設計なら基本的にスクリプトは止められないから、
止まったときに更新するんじゃなく、
別のスクリプトをリリースして、古いスクリプトを退役させるような方式を選ぶと思う。

毎日すぐに処理が終わるようなスクリプトしか目にしてないエンジニアが、
そんな設計とは知らず、そのまま更新しちゃったとかそんな理由なんじゃないかなあ?
0505デフォルトの名無しさん
垢版 |
2022/01/01(土) 11:10:41.01ID:eqRzM57+
>>503
そんなのなら本気やないな。w
テラバイトレベルのバックアップをしっかり実装すんのはなかなかやと思うが。
「日次」でいけるかどうかもあやしいやろ。

クリティカルなシステムでもなし、ただ甘く見てた、てところやろうとは思うが。
0506デフォルトの名無しさん
垢版 |
2022/01/01(土) 11:53:24.53ID:vr0aJE4l
>>505
長時間かかる処理は普通suspend/resumeできるようにするよね?
自作しなくても市販のソフト買ってもいいし

日次で終わるかどうかは障害とは関係ないが
ミラーリングなのに日次で終わらないようなら作りが悪いよ

それにバックアップスクリプトに削除を混ぜるのがそもそも間違い
ジョブの単位や依存関係の管理が杜撰
0508デフォルトの名無しさん
垢版 |
2022/01/01(土) 15:00:36.73ID:w7Saqf4k
>>506
世代バックアップするなら旧世代のバックアップを削除すべきだろうし、
スクリプトで作った一時ファイルは、そのスクリプトで消すべきだと思う。

やはりスクリプトの更新方法の不備かと。
0510デフォルトの名無しさん
垢版 |
2022/01/01(土) 15:08:39.26ID:9R1m0X3m
>>508
世代バックアップちゃうで
今回の障害を受けて世代バックアップ検討しますて書いとるやろ
0512デフォルトの名無しさん
垢版 |
2022/01/01(土) 16:05:12.10ID:5XWhCSq7
>>472
動的な部分以外で?
0513デフォルトの名無しさん
垢版 |
2022/01/01(土) 20:11:57.76ID:VJKo4de7
>>475
俺、ティム・クックと0円でランチを一緒にしたことあるぞ。
例の宇宙船にほど近いレストランのカウンター席でメシを食ってたら隣に誰か座ってきた。
その人は電話をしまくってて、落ち着かねー奴だなーと思って顔をよく見たら... !!!
0514デフォルトの名無しさん
垢版 |
2022/01/01(土) 21:57:57.81ID:eqRzM57+
>>509
> OSはLinuxやで
それはカーネルやろ。

> Cray用のソフトも普通に売ってるで
どこの店でどんなふうに?
いわゆる「市販」とちゃうやろ。
0515デフォルトの名無しさん
垢版 |
2022/01/01(土) 22:33:56.61ID:OowWZOH4
>>498
それ内部形式じゃないぞ?
100MBのシェルスクリプトのソースコードを生成してるだけ
100MBのシェルスクリプトを実行してもわずかのメモリしか消費しない

内部形式は小さいからだ!


やっぱアホの子はお前の方?w
0516デフォルトの名無しさん
垢版 |
2022/01/01(土) 23:26:19.57ID:2clFsvDI
>>514
off-the-shelf softwareの日本語訳だよ

そこら辺の電気屋さんとかで買えるという意味の市販とは確かに違うが
市販ソフトって言葉は文脈によってもう少し広い意味になるよ
勉強になった?
0521デフォルトの名無しさん
垢版 |
2022/01/02(日) 10:42:41.52ID:8JZTRTCW
>>508
処理をどので分割すべきか理解してない典型例
cronのような原始的なのしか使ったことないでしょ
*nix系あるある
0522デフォルトの名無しさん
垢版 |
2022/01/02(日) 12:46:42.90ID:krHLUjqu
>>519
それで動作保証まですんのはなかなかのチャレンジャーやと思うが。w
そんなことより、どこで売ってんの?
0524デフォルトの名無しさん
垢版 |
2022/01/02(日) 12:53:06.50ID:o9R7ffl7
>>472
LinuxでPerlで実験してみたが同じ問題は出なかったぞ。
$0 のファイルにプログラムを追加書き込みしてもその部分は実行されない。
シェルで同様に$0に追加書き込みしたらその部分は実行された。
0526デフォルトの名無しさん
垢版 |
2022/01/02(日) 14:56:13.51ID:o9R7ffl7
だよなあ。eval や動的にソース読んで実行する個所以外は問題ないよなあ。
■ このスレッドは過去ログ倉庫に格納されています

ニューススポーツなんでも実況