質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.46%
シェルスクリプト

シェルスクリプトは、UNIX系のOSもしくはコマンドラインインタプリタ向けに記述されたスクリプト。bash/zshといったシェルによって実行されるため、このように呼ばれています。バッチ処理などに使用されており、テキストファイルに書かれた命令を順に実行します。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

シェル

シェル(shell)はUnix や Linux 系のOSで使用されるコマンドインタプリタを指します。

Q&A

解決済

2回答

936閲覧

複数の戻り値の足し算を任意の結果を出したい

tune-

総合スコア10

シェルスクリプト

シェルスクリプトは、UNIX系のOSもしくはコマンドラインインタプリタ向けに記述されたスクリプト。bash/zshといったシェルによって実行されるため、このように呼ばれています。バッチ処理などに使用されており、テキストファイルに書かれた命令を順に実行します。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

シェル

シェル(shell)はUnix や Linux 系のOSで使用されるコマンドインタプリタを指します。

0グッド

0クリップ

投稿2020/10/07 11:42

ロジックについての質問です。

背景

Linux環境にて複数のサービスのシェルにて稼働確認するシェルを作成しています。
サービス数は100程度あります。

For文にてサービス稼働確認をし、1つのサービスの確認結果を戻り値に返し
全サービス分繰り返します。
戻り値は1つのサービス確認ごと加算します。
2つのサービスが異常終了してた場合、2つの戻り値の合計結果を返す仕組みになります。
最終的には戻り値の結果で、どのサービスが異常終了していたか確認したいと考えています。
以下のようなイメージです。

戻り値3 〇〇サービスが異常終了
戻り値5 〇〇サービスと〇〇サービスが異常終了


質問

どのような計算をすれば1~100までの戻り値の合計結果が一意になるのでしょうか。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

子のシェルスクリプトの返り値($?)を親が処理して、親がさらに呼び出しもとにexit nで返り値を返してその値で、判断したいということでしょうか?

であれば、無理です。返り値の取れる範囲は0255なので256通りの結果しか表現できまませんが、100個のシェルスクリプトの返り値がゼロか非ゼロかを表現するには、2の100乗(1267650600228229401496703205376)の値の範囲が必要です。

文字列で返すようにするしか無いです。標準出力に出すとか、ファイルに書くとか。

投稿2020/10/07 12:12

otn

総合スコア84800

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tune-

2020/10/07 13:56

ありがとうございます。 シェルスクリプトは1つとなります。 戻り値は1以上を指定しようと考えています。 戻り値をサービス確認結果毎に変数に加算する仕組みとなります。 1サービス目が異常終了 → 戻り値1 2サービス目が異常終了 → 戻り値2  → 戻り値の合計は3 (1+2) 最終的な戻り値(変数)が3の場合は、サービス1,2が異常しているといった判断をしたいと考えています。 例えば変数に加算する際に何かしらの計算式(+1するなど)を入れることで実現は難しいでしょうか。 もしくは、Pythonでの実現を考えています。
otn

2020/10/07 14:24

回答に書いたように、返り値は0~255なので、8サービスまでであれば可能です。 1,2,4,8,16,32,64,128をそれぞれ加算すれば良い。 9サービス以上への対応はこの方法では不可能です。
tune-

2020/10/07 14:50

了解しました。 別の手法を考えます。 ありがとうございました。
guest

0

1つの情報(正常/異常)を記録するのに1ビットだけ使うとし、各サービスの情報は独立しているとすると、100サービスで100ビット必要ですね。

投稿2020/10/07 11:52

Daregada

総合スコア11990

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tune-

2020/10/07 13:43 編集

ありがとうございます。 1サービス目の異常終了値が1、2サービス目の異常終了値が10みたいな形でしょうか。 これなら確かに実現はできますが桁数が大きすぎですね。。
Daregada

2020/10/07 13:57

そもそも、4つのサービスだけ考えても、2進数表現で0001, 0010, 0100, 1000としないと、それぞれの異常が重なって起きる状態を判別できません。
tune-

2020/10/07 14:51

ありがとうございます。 もう少し別の手法を検討します。
Daregada

2020/10/07 14:53

例えば、合計値が「5」だったとして、あなたが考えている方法だと、これが「1と4」なのか「2と3」なのか(合計値だけからは)判別できないので、根本的に無理です。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.46%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問