- 1 名前:デフォルトの名無しさん mailto:sage [2018/09/22(土) 11:53:21.38 ID:BBiLRgnj0.net]
- !extend:on:vvvvv:1000:512
!extend:on:vvvvv:1000:512 シェルスクリプトに関する総合スレッドです。 スレ立て時は以下の文を先頭行に加えて下さい。 後のつけ忘れ防止の為に複数行重ねて追加推奨 !extend:on:vvvvv:1000:512 全般 ・荒しは無視しましょう。 ・丁寧な姿勢を心掛けましょう。 ・ネチケット(死語)を意識しましょう。 前スレ シェルスクリプト総合 その28 mevius.5ch.net/test/read.cgi/tech/1532397676/ VIPQ2_EXTDAT: default:vvvvv:1000:512:----: EXT was configured
- 432 名前:デフォルトの名無しさん mailto:sage [2018/11/01(木) 22:35:03.93 ID:Kkuf6Nxk0.net]
- だから仕方ないかって書いてんのにw
ほんと人の話読まないやつだな 400 自分:デフォルトの名無しさん (ワッチョイ ab98-QXT6)[sage] 投稿日:2018/11/01(木) 19:51:11.07 ID:Kkuf6Nxk0 [4/15] 遅くなるのでディスクに書き込みたくないし、メモリも あまり使用したくなかったんだけど仕方ないか
- 433 名前:デフォルトの名無しさん mailto:sage [2018/11/01(木) 22:35:30.89 ID:bLNYdVH2a.net]
- えっなにこれは…
- 434 名前:デフォルトの名無しさん mailto:sage [2018/11/01(木) 22:36:17.06 ID:upF+pHX50.net]
- tee(1)コマンド使ったらいけるかなとか考えたが無理かな。
- 435 名前:デフォルトの名無しさん mailto:sage [2018/11/01(木) 22:43:09.27 ID:Kkuf6Nxk0.net]
- >>434
片方ファイルだもんね。 メインプロセス起動(出力を2つに分岐) ├出力1 偶数行表示プロセス実行 └出力2 奇数行表示プロセス実行(偶数行表示プロセス終了後に処理開始) みたいな事ができるかな?と思ったんだけど まあ、これでも内部的には出力がバッファに 溜め込まれてるんだろうけどね
- 436 名前:デフォルトの名無しさん [2018/11/01(木) 22:48:35.54 ID:zo7FxUKXr.net]
- >>432
お前ホントバカだな お前のようなバカのためにプログラム書いてやったぞ eo-sort.exe 第一引数に入力ファイルを渡せば標準出力に まず偶数業出してその後に奇数業出してくれる 必要ならそれをファイルにリダイレクトしなよ
- 437 名前:デフォルトの名無しさん mailto:sage [2018/11/01(木) 22:49:59.34 ID:Kkuf6Nxk0.net]
- いらねっす
- 438 名前:デフォルトの名無しさん mailto:sage [2018/11/01(木) 22:53:44.24 ID:zo7FxUKXr.net]
- ああ、あと出し情報で偶数奇数じゃなかったんだよな
そりゃいらないわなw
- 439 名前:デフォルトの名無しさん mailto:sage [2018/11/01(木) 22:54:34.69 ID:Kkuf6Nxk0.net]
- え?あぁ、そうだな
- 440 名前:デフォルトの名無しさん mailto:sage [2018/11/01(木) 23:01:11.09 ID:upF+pHX50.net]
- >>435
というかよく読んだら「ファイルディスクリプタをうまく使う」ってそういうことだよね teeっていうのはファイルと標準出力に書き込む「ファイルディスクリプタをうまく使う」コマンドの一つなんだからさ。 まあ俺には変数使わずに出力を分けるのは無理かな。 ところで変数使わない理由はPOSIXシェルスクリプトは変数のスコープができず 利用者が定義している定数を潰す可能性があるからって理解でいいのかな?
- 441 名前:デフォルトの名無しさん mailto:sage [2018/11/01(木) 23:17:46.65 ID:JoiMeSvG0.net]
- 印刷して紙でやればメモリもディスクも使わないんじゃね?
- 442 名前:デフォルトの名無しさん mailto:sage [2018/11/01(木) 23:22:18.99 ID:0eDQcpEPa.net]
- 天才か
- 443 名前:デフォルトの名無しさん mailto:sage [2018/11/01(木) 23:31:18.23 ID:45pCF+y00.net]
- じゃぁ moreutils の pee コマンドでも使ったら
$ cat hogehoge | pee 'awk "!(\$1%2)"' 'awk "\$1%2"'
- 444 名前:デフォルトの名無しさん [2018/11/01(木) 23:58:02.32 ID:s+SrulDE0.net]
- >>441
コペルニクス的転回だな。
- 445 名前:デフォルトの名無しさん mailto:sage [2018/11/02(金) 00:25:05.23 ID:qf9daF/z0.net]
- 同じターミナルに出力するのが仕様間違いだろ。スクロールバックがめんどくさい。
- 446 名前:デフォルトの名無しさん mailto:sage [2018/11/02(金) 01:50:44.73 ID:RWqagkCBM.net]
- >>393
出来るぞ もう諦めたのならまあいいか
- 447 名前:デフォルトの名無しさん mailto:sage [2018/11/02(金) 03:41:34.10 ID:fhEBIQ700.net]
- 確かに
- 448 名前:デフォルトの名無しさん mailto:sage [2018/11/02(金) 06:24:06.72 ID:tmRne/9W0.net]
- >>443
これすごいね。 peeコマンドに可搬性を持たせられたらいいんだけど、それが問題だよね
- 449 名前:デフォルトの名無しさん [2018/11/02(金) 06:38:46.12 ID:BwjETkqh0.net]
- あのう、プロセス動かすだけでメモリ消費してしまうんですが
変数や作業用ファイル作らなくても内部的な一時ファイルは作られるわけで リソース消費しないで切り分けようとエディタ立ち上げて手作業でやっても、やっぱりリソース消費があるので 誰かが言ったように、ノートかなにかに手書き転記するしかないと思う つうか、そんな人はコンピュータ使っちゃダメだと思う まるで、経団連会長みたいなんだもの 最近会長室にコンピュータが導入されたらしい あれこれ、たかが変数や作業用ファイル如きでリソース消費しないように考える時間など無駄中の無駄 なにも、惑星探査衛星の限られたリソースでなんとかするって話じゃないんだから 時間の使い方を間違っている そんな下らない話題で、ここのスレのリソースも無駄遣い
- 450 名前:デフォルトの名無しさん mailto:sage [2018/11/02(金) 07:18:03.73 ID:bE/8yEKV0.net]
- >>446
諦めてないです!まってます!
- 451 名前:デフォルトの名無しさん mailto:sage [2018/11/02(金) 07:42:30.53 ID:bE/8yEKV0.net]
- >>448
> peeコマンドに可搬性を持たせられたらいいんだけど、それが問題だよね こんなんでどう? peeコマンドのシェルスクリプト実装版 シェルスクリプトで実装したから外部コマンドだけじゃなくてシェル関数も呼べるよ #!/bin/sh pee() { ( ( ( while IFS= read -r line; do printf '%s\n' "$line" printf '%s\n' "$line" >&3 done | "$1" >&4) 3>&1 ) | "$2" ) 4>&1 } foo() { printf 'foo %s\n' "$(cat -)"; } bar() { printf 'bar %s\n' "$(cat -)"; } pee foo bar
- 452 名前:デフォルトの名無しさん mailto:sage [2018/11/02(金) 07:59:00.48 ID:bE/8yEKV0.net]
- >>443
>>451のシェルスクリプト実装版もそうだけど、 俺の予想が正しければ、その2つのawkは並列に動作するんじゃないかな? 1つ目のコマンド実行が完了まで2つ目のコマンドの実行をブロックするとは 思えないので2つの出力は混じって出てくると思う。 プロセス起動のオーバーヘッドがあるから少量のデータだと コマンド順に出力されるように見えるかもだけど
- 453 名前:デフォルトの名無しさん mailto:sage [2018/11/02(金) 08:25:40.36 ID:bE/8yEKV0.net]
- あれ? これでできてね?
最初こんな感じだったからブロックされずに混じって出てくることになったけど foo() { cat -; } bar() { cat -; } こうしたせいで出力がブロックされてる気がする foo() { printf 'foo %s\n' "$(cat -)"; } bar() { printf 'bar %s\n' "$(cat -)"; }
- 454 名前:デフォルトの名無しさん mailto:sage [2018/11/02(金) 08:26:07.31 ID:tmRne/9W0.net]
- >>451
https://www.mankier.com/1/pee これを読む限り引数は2つだけじゃないから,ちょっと機能不足かもね。 もちろん今回のあなたの目的には合うけど(2通りのパイプがあればそれで十分でしょう?) ただ,もっと一般的なpee(1)コマンドを作ろうと思うと, 引数の数に応じてまずは雛形を作りそれをevalする,みたいな方法を採る必要があるかも。
- 455 名前:デフォルトの名無しさん mailto:sage [2018/11/02(金) 08:41:23.56 ID:bE/8yEKV0.net]
- >>454
複数対応だと面倒くさそう・・・ eval使えば可能だろうけど、文字列組み立てるのが そう。今回書いた内容は>>453でできる。 だけど今回書いてないもう一つの制限があってそれで出来ない・・・ (制限っていうのはパイプで関数に渡すんじゃなくて変数で渡したい) まあいいや、また長くなりそうだから質問閉じるわ とりあえず変数使わずに出力をまとめることはできたし あとは別の問題
- 456 名前:デフォルトの名無しさん mailto:sage [2018/11/02(金) 09:19:53.88 ID:Rb6mIS4M0.net]
- foo() { printf 'foo %s\n' "$(tail -n 1 -)"; }
bar() { printf 'bar %s\n' "$(head -n 1 -)"; } ってして seq 1000 | ./pee.sh としたら実行する度に foo の値 が違ってるな…どちからの子プロセスが実行完了したら while も終了するから仕方ないんだろうけど。trap '' PIPE ってすると I/O error になるし
- 457 名前:デフォルトの名無しさん [2018/11/02(金) 09:45:49.16 ID:0QIYfvOaa.net]
- >>449
> なにも、惑星探査衛星の限られたリソースでなんとかするって話じゃないんだから いや知らんけどそういう極小環境なのかも知れんよ。そうでなければこんな要求出てこないと思うが。
- 458 名前:デフォルトの名無しさん mailto:sage [2018/11/02(金) 09:56:03.14 ID:bE/8yEKV0.net]
- >>457
正解。組み込みマシンも対象としている
- 459 名前:デフォルトの名無しさん mailto:sage [2018/11/02(金) 09:59:54.78 ID:bE/8yEKV0.net]
- 限定的ながら変数で渡すっていうのが出来てしまったので晒す。多分使わない
#!/bin/sh main() { index=0 ( ( ( while IFS= read -r line; do index=$((index+1)) dumpvar_and_call "even" dumpvar_and_call "odd" >&3 done | eval "$(cat -)" >&4) 3>&1 ) | eval "$(cat -)" ) 4>&1 } dumpvar_and_call() { set; echo "$1"; } even() { if [ $((line % 2)) = 0 ]; then echo "index:$index even $line" sleep 1 fi } odd() { if [ $((line % 2)) = 1 ]; then echo "index:$index odd $line" fi } main<<HERE 3 6 7 4 2 8 HERE
- 460 名前:デフォルトの名無しさん mailto:sage [2018/11/02(金) 10:03:43.36 ID:bE/8yEKV0.net]
- なんで使わないかというと、変数をパイプで渡すために
setでシェル変数をダンプして、evalしてるんだが、 bashでは読み取り専用変数があってエラーになるから setの出力をあれこれフィルタすればできると思うが、 変数の中に改行が入ってる場合とか対応が面倒 bashなら変数名に特定のプリフィックスがついたものだけ ダンプできたとは思うが他のシェルではそうは行かない また、行ごとに変数すべてをsetしてevalとか パフォーマンス悪そうだし。
- 461 名前:デフォルトの名無しさん mailto:sage [2018/11/02(金) 10:11:28.72 ID:GFVwJxnL0.net]
- >>457
そんな環境でPosix縛りだとしたら、プロジェクト自体が間違ってる。
- 462 名前:デフォルトの名無しさん mailto:sage [2018/11/02(金) 10:16:42.75 ID:bE/8yEKV0.net]
- > そんな環境でPosix縛りだとしたら
実はPOSIXよりも状況が悪いw 使える機能がPOSIX未満なんだよ。 つまり一部の機能しか実装されていない
- 463 名前:デフォルトの名無しさん mailto:sage [2018/11/02(金) 11:47:49.42 ID:tmRne/9W0.net]
- ただの愚痴だけど
POSIXユーティリティにネットワーク通信が含まれてないのってマジで致命的欠陥だと思う。 POSIX原理主義とか,たしかに素晴らしい考えだとは思うけど,ネットワーク通信なくして現在のコンピュータを管理・運用するのは不可能っていうか もしできてもすごくつまらないでしょう。
- 464 名前:デフォルトの名無しさん [2018/11/02(金) 12:35:03.14 ID:e7WVTJJGr.net]
- なんでバカって大げさに言いたがるんやw
致命的てwww
- 465 名前:デフォルトの名無しさん [2018/11/02(金) 13:04:44.69 ID:0QIYfvOaa.net]
- >>464
大袈裟に言うなよ
- 466 名前:デフォルトの名無しさん [2018/11/02(金) 19:08:56.10 ID:a5BSTCMR0.net]
- なぜか悔しがって意味不明なバカ>>465
どないなっとんねんおまえらwww
- 467 名前:デフォルトの名無しさん [2018/11/02(金) 23:14:17.14 ID:KoqyjIsr0.net]
- アンリカバブルな低学歴知恵遅れだからしょうがない
- 468 名前:デフォルトの名無しさん [2018/11/03(土) 05:20:12.41 ID:vg8hCxXN0.net]
- 大げさだなあ
- 469 名前:デフォルトの名無しさん mailto:sage [2018/11/03(土) 06:43:33.72 ID:9hr0em1cM.net]
- 日常的に誇大妄想が激しいんだろ
- 470 名前:デフォルトの名無しさん [2018/11/03(土) 17:50:12.58 ID:GQ9FpTGT0.net]
- MicroPythonを実装した方が良さそう
組込にも対応してるから
- 471 名前:デフォルトの名無しさん mailto:sage [2018/11/04(日) 08:48:54.81 ID:S8h/cDRc0.net]
- コマンドを作っていてすこし疑問に思ったことなんだけど
--helpオプションで出力される文章って太字や着色なんかで装飾してもいいのかな。 「いいのかな」っていうか、そういうことしてるコマンドをほとんどみかけないので もしかしたら「--helpオプションで出力される文章は装飾しないように」っていう規約がどこかにあるのかな と思ってさ。
- 472 名前:デフォルトの名無しさん mailto:sage [2018/11/04(日) 10:11:04.15 ID:Nn4ZdlZB0.net]
- >>471
それはいいアイデアだな。 コマンドの出力とは違ってヘルプを入力するプログラムなんて 無いだろうし、カラー専用でもいいくらいなんじゃないか? そう考えると、manとかinfoもカラーにするべきなんだろうな 今どきカラー使えないとかまず無いし 色ももう16色に拘る必要もないだろう 最低でも256色、24bitカラーも普通に使っていいだろう
- 473 名前:デフォルトの名無しさん [2018/11/04(日) 10:12:08.50 ID:iTJ8u5Nd0.net]
- >>471
どこかにあったとしその素性のわからん規約におまえが従う必要ないやんアホなん?
- 474 名前:デフォルトの名無しさん mailto:sage [2018/11/04(日) 11:08:19.99 ID:Ok+6IZd3a.net]
- 慣習は先人の知恵が詰まってる場合もある
自分勝手に振る舞う自称合理的よりよっぽど賢い質問だと思う AIXはmanが黄色とか太字とかで修飾されてた気がするな
- 475 名前:デフォルトの名無しさん mailto:sage [2018/11/04(日) 11:17:07.51 ID:Nn4ZdlZB0.net]
- Linuxでmanを少しカラフルで見やすくする
https://orebibou.com/2016/12/linux%E3%81%A7man%E3%82%92%E5%B0%91%E3%81%97%E3%82%AB%E3%83%A9%E3%83%95%E3%83%AB%E3%81%A7%E8%A6%8B%E3%82%84%E3%81%99%E3%81%8F%E3%81%99%E3%82%8B/ へー
- 476 名前:デフォルトの名無しさん mailto:sage [2018/11/04(日) 11:18:53.69 ID:Nn4ZdlZB0.net]
- ↑ふざけとんのか
BASH(1) General Commands Manual BASH(1) 名名前前 bash - GNU Bourne-Again SHell 書書式式 bash [options] [file] 著著作作権権 Bash is Copyright (C) 1989-2011 by the Free Software Foundation, Inc. 説説明明 bash は、標準入力やファイルから読み込んだコマンドを実行する、 sh 互換のコマンド言語インタプリタです。 bash に は、Korn シェルや C シェル ksh や csh) の便利な機能も採り入れられています。 bash は IEEE POSIX specification (IEEE Standard 1003.1) の Shell and Utilities に準拠する実装を目指していま す。 bash はデフォルトで POSIX 準拠に設定することもできます。 オオププシショョンン
- 477 名前:デフォルトの名無しさん mailto:sage [2018/11/04(日) 11:25:16.76 ID:Nn4ZdlZB0.net]
- これでまともになった
raimon49.github.io/2017/03/31/man-with-colored-pager.html
- 478 名前:デフォルトの名無しさん mailto:sage [2018/11/04(日) 11:56:45.43 ID:S8h/cDRc0.net]
- >>472
24bitカラーはまだマズいと思う。 多くのXデスクトップ環境で利用されてる端末エミュレータ (GNOME TerminalとかLXTerminalとか)は LibVTEベースなのよ。 そしてLibVTEの安定板は24bitカラーには対応してない。
- 479 名前:デフォルトの名無しさん [2018/11/04(日) 12:58:38.32 ID:MKH8Qowh0.net]
- そういうのを根本的に対応できるようにするなら
roffが対応する部分になるからな このスレでやってることは 池沼の塗り絵
- 480 名前:デフォルトの名無しさん mailto:sage [2018/11/04(日) 13:16:39.02 ID:Nn4ZdlZB0.net]
- >>478
WSLは対応したのに? WSL その41 - Windowsのコンソールが24bitカラーをサポート・Bashからカラフルな出力が可能に https://kledgeb.blogspot.com/2016/09/wsl-41-windows24bitbash.html
- 481 名前:デフォルトの名無しさん mailto:sage [2018/11/04(日) 16:48:40.44 ID:V6s3/sLe0.net]
- >>480
ま,まぁ? 24bitカラーなんて端末エミュレータの本来の機能じゃないし? (震え声)
- 482 名前:デフォルトの名無しさん mailto:sage [2018/11/04(日) 20:50:30.36 ID:eEexL0w40.net]
- >>480
じゃあそこからsshでログインすればいいじゃん。 これにて一件落着。
- 483 名前:デフォルトの名無しさん mailto:sage [2018/11/04(日) 20:58:33.34 ID:Nn4ZdlZB0.net]
- >>482
俺に言うなってw 24bitカラーも普通に使っていいだろうって 最初から言ってるだろ
- 484 名前:デフォルトの名無しさん mailto:sage [2018/11/04(日) 23:47:16.17 ID:EATzJZ5p0.net]
- そして寒い寒いマシン室に押し込められる可哀想な
おじさん達のことは誰も考えてくれないんだよな。
- 485 名前:デフォルトの名無しさん mailto:sage [2018/11/05(月) 00:50:02.70 ID:8mReqxsGa.net]
- かわいそう
- 486 名前:デフォルトの名無しさん mailto:sage [2018/11/05(月) 01:09:40.53 ID:LRv++2Wv0.net]
- マシン室が
- 487 名前:デフォルトの名無しさん mailto:sage [2018/11/06(火) 16:17:47.15 ID:Vcs848wz0.net]
- ... | sort -k 2.2 や
... | uniq -c のような、パイプ挟んでもオプション使えるシェルスクリプトが書けません これはどうやればいいのでしょうか?
- 488 名前:デフォルトの名無しさん mailto:sage [2018/11/06(火) 16:19:39.11 ID:cucsRggBM.net]
- 理解不能
- 489 名前:デフォルトの名無しさん mailto:sage [2018/11/06(火) 16:27:38.20 ID:Vcs848wz0.net]
- ... | perl -0777 -ne 'print grep(m{ココ1}i, split("(?=ココ2)", $_));'
例えばこのような文脈で動作させていたものを パイプ移行をシェルスクリプトに書いておき 変数ココ1 ココ2 に渡して処理したいのです | split_grep.sh ココ1 ココ2 このように動作させたいのですが $1 $2 ... などを見ても 参照できてなくて困っています
- 490 名前:デフォルトの名無しさん mailto:sage [2018/11/06(火) 16:53:48.26 ID:7Ll1zO1lM.net]
- ' だからじゃねえか?適切に " を使え。
- 491 名前:デフォルトの名無しさん mailto:sage [2018/11/06(火) 18:09:54.51 ID:dlj8br7m0.net]
- --helpオプションで出力される手引きの装飾についてだが
less(1)ユーティリティは太字とにしてるね。
- 492 名前:デフォルトの名無しさん mailto:sage [2018/11/06(火) 23:18:09.57 ID:9jHKU1L00.net]
- シェルスクリプトは20年動くとか言ってるやつがいるけど、
あれ嘘だなぁ。 各シェルの実装は互換性がない部分があるし、 同じシェルでもバージョンが変わると微妙に動きが変わる POSIXという仕様があってもそれを完全に実装しているとは 限らないしバグもある。 20年前のJavaScriptと同じようなレベルだ。 そのJavaScriptも20年前のものが今でも動いているからねw 今のJavaScriptは本当にどれもで同じように動くようになったけど20年前は大変だった。 どのシェルでも同じように動くシェルスクリプトを書くのは今でも大変だよ 一度互換性テストでもやって準拠度100%を達成を競わせたほうが良いだろう
- 493 名前:デフォルトの名無しさん mailto:sage [2018/11/07(水) 03:53:59.64 ID:XzpCa+6s0.net]
- 「POSIXという一つの規格」がなぜそんなに強力だと思うのか分からない。
Pythonの公式文書やECMAが規格するJavaScriptと同等の立場でしょう。 もちろん,俺がシェルスクリプトを書くときは,俺がPythonやJavaScriptを書くときと同じく POSIXという共通規格に従うようにしているが,それは今後20年動かす為じゃない。
- 494 名前:デフォルトの名無しさん mailto:sage [2018/11/07(水) 09:26:49.70 ID:66xysPr5r.net]
- cronから実行しているシェル(スクリプト)があるんだけど
2重実行されると問題があるので そのシェルをくるむ親シェルを作って そこで事前にpkillで実行されているシェルおよびコマンドを無条件にkillしてる でも最近もともと実行してるシェルを複数回ループで実行したい要件が出てきた 単純に親シェルでループさせることを考えたけど pkillしてもループで再実行されてkill出来ずに2重実行される問題が出てくる シェルを親子孫の3階層にして新しく間に挟む子シェルでループさせ 親シェルのpkillではこの子と孫とコマンドをkillするといいと思うんだけど 階層が深くなって嫌だなと思うんだけど何かいい案ない? ちなみに孫シェルでループってのも考えたけど cron以外ではループさせたくない場合が多いので そこには手を加えずシンプルなままとしたいため考慮から外しました
- 495 名前:デフォルトの名無しさん mailto:sage [2018/11/07(水) 09:42:23.92 ID:+ld6QnEyM.net]
- pkillとか野蛮な方法じゃなくて、ちゃんとロックして、ロック取れなければ死ねばいいのでは?
- 496 名前:デフォルトの名無しさん [2018/11/07(水) 09:48:09.44 ID:bimd4khFa.net]
- もしflockコマンドがあればそれで可能な筈。
- 497 名前:デフォルトの名無しさん mailto:sage [2018/11/07(水) 09:48:23.84 ID:v2POOMdv0.net]
- どこまでの子プロセスとか残る可能性がとか条件が全然わからんが、シェルスクリプトを2重実行しないようにだけなら、その冒頭で、
[ -f /var/run/hogehogeshellscript.pid ] && kill -0 $(cat /var/run/hogehogeshellscript.pid) && exit 0 printf "%d" $$ > /var/run/hogehogeshellscript.pid 後始末で rm -f /var/run/hogehogeshellscript.pid が常套手段だな、俺は。「事前にpkillで実行されているシェルおよびコマンドを無条件にkillしてる」なんて、バグって残る場合しか考えられない(そんな動いているの殺していいの??)
- 498 名前:デフォルトの名無しさん mailto:sage [2018/11/07(水) 09:55:36.16 ID:zUpUn5UV0.net]
- そもそも考え方自体が理解しがたい
こんなクソなことやり出すやつとは仕事したくない
- 499 名前:デフォルトの名無しさん mailto:sage [2018/11/07(水) 09:56:12.27 ID:+ld6QnEyM.net]
- >>497
cronで「しか」起動しないなら実用上問題ないかもしれんが、 まともなロックじゃないので2重起動されうる。
- 500 名前:デフォルトの名無しさん mailto:sage [2018/11/07(水) 10:01:20.98 ID:v2POOMdv0.net]
- >>499
まさか、タイミング的な話? >>494で十分なもんだし、そんなシェスクリプト書きませんよ。そんな超短時間で多重起動されうるもんなんて、シェルスクリプトなんて書かない
- 501 名前:デフォルトの名無しさん mailto:sage [2018/11/07(水) 11:16:33.73 ID:UCphLCxy0.net]
- バグの言い訳をシェルスクリプトのせいにするなよ
シェルスクリプト以外でもやり方は一緒だろ それともシェルスクリプトでは不可能で 他の言語なら可能な方法があるとでも言うのか? > そんな超短時間で多重起動されうるもんなんて、シェルスクリプトなんて書かない シェルスクリプト以外でいいんで、どうやるのか答えてみて
- 502 名前:デフォルトの名無しさん mailto:sage [2018/11/07(水) 11:40:25.66 ID:v2POOMdv0.net]
- バグの言い訳??
そんなタイミングにシビアなのは普通にCなりで書くけど?なんか知らんがシェルスクリプトで処理スピードに必死なヤツもいるけど、そんなに時間にシビアなら普通にCでするだろう(一部でも) てか、デーモンだろな。別にシェルスクリプトでデーモン書いてもいいけど、小回りが利くのはやっぱCなりの方だな
- 503 名前:デフォルトの名無しさん mailto:sage [2018/11/07(水) 11:41:10.13 ID:UCphLCxy0.net]
- いや、だから、C言語でいいんで、多重起動しない方法書いてみてって、
どうせそれがシェルスクリプトでも使えるだろ
- 504 名前:デフォルトの名無しさん mailto:sage [2018/11/07(水) 11:48:02.80 ID:v2POOMdv0.net]
- 何に絡んでいるのかわからん
粒度が全然違うことなぞCで何か書いたことがあるのならわかるだろう。>>499がその粒度の話だからな
- 505 名前:デフォルトの名無しさん mailto:sage [2018/11/07(水) 11:50:35.19 ID:UCphLCxy0.net]
- 絡んでいない。C言語で多重起動しない方法は
シェルスクリプトでも使えると言ってる だからシェルスクリプトで書かない理由にはならない
- 506 名前:デフォルトの名無しさん mailto:sage [2018/11/07(水) 11:52:41.86 ID:v2POOMdv0.net]
- だから、粒度って言ってるじゃん。わからんのだな。話にならんな
- 507 名前:デフォルトの名無しさん mailto:sage [2018/11/07(水) 11:55:02.47 ID:oFuFuwyAa.net]
- 結論の出ない子供同士の戦い
ファイッ
- 508 名前:デフォルトの名無しさん mailto:sage [2018/11/07(水) 11:55:08.02 ID:UCphLCxy0.net]
- > 粒度って言ってるじゃん
なんの説明にも反論にもなってない 粒度が違っても関係ない話だろ(他の人には「粒度」といい方で伝わってるはずw)
- 509 名前:デフォルトの名無しさん mailto:sage [2018/11/07(水) 11:56:38.86 ID:v2POOMdv0.net]
- うるせっw
どうもシェルスクリプト大好き(後は私怨かなあとw)な絡みで、それ視点でしかなのでうやむやにしてんだけどね。言ったってたぶん聞かない人だから
- 510 名前:デフォルトの名無しさん mailto:sage [2018/11/07(水) 11:59:05.62 ID:v2POOMdv0.net]
- >>506
タイミング的な話なら、余計なことがない方が粒度が細かい=そっちにに決まっているだろう だがしかし、いくら粒度が細かくたってだから、デーモンでだろなだけどな
- 511 名前:デフォルトの名無しさん mailto:sage [2018/11/07(水) 12:06:12.02 ID:UCphLCxy0.net]
- > 余計なことがない方が粒度が細かい
粒度の使い方を待ちってるだけじゃないか で、デーモンにしないと多重起動は防げないって話をしてんのか? デーモンにすれば多重起動を防げる理由は? ほらな、突っ込まれるとこの程度、答えられないんだよw
- 512 名前:デフォルトの名無しさん mailto:sage [2018/11/07(水) 12:07:51.60 ID:8DqZdVO16.net]
- すまん 口を挟むけど
「 1. シェルスクリプトは各コマンドの起動時間やカーネルがファイルをどのように扱うということを 可搬な方法ではほとんど制御できない。 一方でCはそもそもOSがそれで書かれているように、上記の事柄を比較的簡単に実現できる。 2. ロックファイルを用いた多重起動防止アルゴリズムにはコマンドの制御時間やファイルの扱いを考える必要がある。 3. よってCと同じアルゴリズムをシェルスクリプトで記述しても それは運用に耐えるものでなくなってしまう。 だから無意味 」 ↑こういう理解でいいか?
- 513 名前:デフォルトの名無しさん mailto:sage [2018/11/07(水) 12:09:17.82 ID:v2POOMdv0.net]
- >>511
>粒度の使い方を待ちってる(間違ってる)だけじゃないか はあ? >デーモンにすれば多重起動を防げる理由は はあ?デーモンは一つ動けば十分だからな。ま・さ・か、デーモンにしても多重起動を防げないとか言い出してるわけ?だとしたらアホだな
- 514 名前:デフォルトの名無しさん mailto:sage [2018/11/07(水) 12:16:34.30 ID:v2POOMdv0.net]
- >>512
別に無意味とは言わないよ。俺は書かないというだけで。なんでシェルスクリプトでタイミング的な諸々をシェルスクリプトというある意味隠蔽された条件制約で悩まなくちゃならんねんってとこから。それならCでのほうがスッキリ小回りが利くしという 後は、超短時間で多重起動されうるもんなんてよりCで書くなという、そんな起動頻度のあるのは、スクリプトではしない
- 515 名前:デフォルトの名無しさん mailto:sage [2018/11/07(水) 12:21:30.58 ID:UCphLCxy0.net]
- >>512
> シェルスクリプトは各コマンドの起動時間やカーネルがファイルをどのように扱うということを > 可搬な方法ではほとんど制御できない。 それはプロセスの多重起動を防ぐ方法と関係ない > ロックファイルを用いた多重起動防止アルゴリズムにはコマンドの制御時間やファイルの扱いを考える必要がある。 コマンドの制御時間やファイルの扱いとかなんの話をしてるのか >>497はアルゴリズムの間違いなのでロックファイルがどうとか関係ない (どうせC言語で作っても同じ間違いをするだろう) > よってCと同じアルゴリズムをシェルスクリプトで記述しても それは運用に耐えるものでなくなってしまう。 今はプロセスの多重起動の話でしか無いので、多重起動が出来ないならば運用に耐えられる それがシェルスクリプトできないわけがない。
- 516 名前:デフォルトの名無しさん mailto:sage [2018/11/07(水) 12:24:39.53 ID:UCphLCxy0.net]
- >>513
> はあ?デーモンは一つ動けば十分だからな。ま・さ・か、デーモンにしても多重起動を防げないとか言い出してるわけ?だとしたらアホだな デーモンが一つ動けば十分だとかそういう話をしてるんじゃない。 プロセスの多重起動を防ぐにはどうするかの話で、、 それはデーモンにしないと出来ないことではないだろ >>514 > なんでシェルスクリプトでタイミング的な諸々をシェルスクリプトというある意味隠蔽された条件制約で悩まなくちゃならんねんってとこから。 だから、なんでシェルスクリプトにこだわってるのか? こっちはお前が、プロセスの多重起動を防ぐ正しい方法を知らないんだろうなって思ってるんだよ。 だからC言語でいいから書いてみろと。 同じアルゴリズムはシェルスクリプトでも使えるから、シェルスクリプトかどうかの話じゃないって言ってんの で、C言語でプロセスの多重起動を防ぐ正しい方法を書けないんだろう? 出てないってことそういうことだ。シェルスクリプトだからと嘘をつくな
- 517 名前:デフォルトの名無しさん mailto:sage [2018/11/07(水) 12:24:57.98 ID:v2POOMdv0.net]
- >>513
>>497はアルゴリズムの間違いなのでロックファイルがどうとか関係ない ただのイチャモンか。またか?コマンドのようにw
- 518 名前:デフォルトの名無しさん mailto:sage [2018/11/07(水) 12:26:20.56 ID:v2POOMdv0.net]
- >>516
ただのイチャモンやん。また、無茶苦茶やな。なにを問題にしているのかイミフ。いちゃもんのためのいちゃもんやなあ
- 519 名前:デフォルトの名無しさん mailto:sage [2018/11/07(水) 12:29:45.81 ID:UCphLCxy0.net]
- >>518
何を問題にしているかもわかってないのか? >>517も指摘しているが、>>497は多重起動チェックのアルゴリズムに問題がある シェルスクリプトだからこれしか出来ないという話ではない
- 520 名前:デフォルトの名無しさん mailto:sage [2018/11/07(水) 12:31:32.56 ID:UCphLCxy0.net]
- あ、>>517って俺の書き込みか
わかるように書けよw
- 521 名前:デフォルトの名無しさん mailto:sage [2018/11/07(水) 12:33:40.01 ID:v2POOMdv0.net]
- >>519
うーむ、だから粒度の問題と言っているんだけど。なにがアルゴリズムに問題があるの?cronで起動する大きな粒度では問題ないと思うけど あるとしたら、起動終了間近とか??それは別の話だろうしな???
- 522 名前:デフォルトの名無しさん mailto:sage [2018/11/07(水) 12:35:54.84 ID:v2POOMdv0.net]
- >>520
ああ、すまん。>>516はあんたか。なんで絡んでるねんっ、何を問題にしてるねん??
- 523 名前:デフォルトの名無しさん mailto:sage [2018/11/07(水) 12:39:53.83 ID:v2POOMdv0.net]
- >>522
ああ、いいのかww 何を絡んでるのかイミフすぎ。場合によってって考えられないのかな? そもそも>>499で十分で(十分だろう)というのに対して、その条件以外のツッコミに対して、その漠然として条件なら突き詰めると&俺にとって普通にシェルスクリプトで書かないってことなんだけどなあ 何が気に食わない、何が間違いなのかさっぱりだな
- 524 名前:デフォルトの名無しさん mailto:sage [2018/11/07(水) 12:40:36.54 ID:8DqZdVO16.net]
- >>515
俺は「プロセスの多重起動を防ぐ」というのを 「プロセスを一つ立ち上がっていることを感知する」 という仕組みを作ることだと思っていて、その方法の一つに 「プロセスが起動するときに特定のファイルを生成し そして終了するときそのファイルを削除する (そして そのファイルの有無によって多重起動を判断する)」 というものがある という認識。 「特定のファイル」はロックファイルと呼ばれる。 で ロックファイルアルゴリズムの問題点は非常に素早く二つのプロセスを立ち上げた時に 最初に起動したプロセスがロックファイルを生成し終える前に 二番目のプロセスがロックファイルが存在しないのを理由に立ち上がってしまう (結果として二重起動する) ということだと思っている。 このときに関わってくるのはファイルIOとかその辺のカーネル領域に片足突っ込んだ話なので Cではできるがシェルスクリプトでは難しいということだと考えたんだけど 違いますかね。
- 525 名前:デフォルトの名無しさん [2018/11/07(水) 12:43:18.47 ID:bimd4khFa.net]
- flockコマンド使えって。シェル単体ではそこまでやってくれるやつは多分ないだろうし。
- 526 名前:デフォルトの名無しさん mailto:sage [2018/11/07(水) 12:47:11.27 ID:v2POOMdv0.net]
- >>524
ロックファイル以外でも所詮OSで何らかの起動時のサポートが無ければCでも防げないと思うんだけど、どうだろう? なので、デーモンとして一つ起動して、それを活性化するのがなんだけどな
- 527 名前:デフォルトの名無しさん mailto:sage [2018/11/07(水) 12:56:45.06 ID:sVRrLKNr0.net]
- >>515
>>>497はアルゴリズムの間違いなのでロックファイルがどうとか関係ない どこが間違ってるの? 最初にロック取って最後に解放する、これを間違ってると言うなら 正解を教えてよ。多分逃げるんだろうけど。
- 528 名前:デフォルトの名無しさん mailto:sage [2018/11/07(水) 12:58:34.71 ID:sVRrLKNr0.net]
- >>525
POSIXにないんでしょ、多分
- 529 名前:デフォルトの名無しさん mailto:sage [2018/11/07(水) 13:04:03.69 ID:jS/U4UFDM.net]
- flockがあればそれでいいけど、なくてもmkdirとかln -sで正しいロックが書けるよ
- 530 名前:デフォルトの名無しさん [2018/11/07(水) 13:04:59.10 ID:bimd4khFa.net]
- ロックファイルの有無だけでやる場合は open() で O_EXCL 指定してファイル作ろうとしないと駄目で、シェルスクリプトからこれがやれるかどうかはシェル次第になる。
そういう外部コマンド作って呼び出せば確実だが、それがありなら fcntl() や flock() 等を使ったもう少し信頼性の高そうなロックをした方が良いように思う。 ロックファイルだけでロックする場合はもう一つ強制終了させられた時にファイルが消せずに残る問題がある。 これはファイルのタイムスタンプを見て古ければ動いていないとみなす方法である程度回避可能だが、その場合は動いているプロセスが定期的にファイルを touch する等して更新する必要がある。 しかしそれでも SIGSTOP により停止していただけだったら役に立たない。
- 531 名前:デフォルトの名無しさん mailto:sage [2018/11/07(水) 13:05:12.80 ID:8DqZdVO16.net]
- https://qiita.com/richmikan@github/items/6ca1ec3b354ae2f5505d
「シェルスクリプト 排他制御」でググったらこんな記事があったよ。
- 532 名前:デフォルトの名無しさん [2018/11/07(水) 13:06:37.34 ID:bimd4khFa.net]
- >>529
ああ。それでもできるか。
|

|