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

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

ただいまの
回答率

90.51%

  • sh

    343questions

    shは、UNIX系OSのシェル操作の1つであり、最も基本的なシェルのことです。

Shellscriptで終了したJobのExit Statusを取得したい

解決済

回答 3

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 1,238

Alice1017

score 16

お世話になります。

前提・実現したいこと

【目標】 Shellscriptで終了したJobのExit Statusを取得する

任意のコマンドをバックグラウンドで実行し、実行している間くるくる型のプログレスバーを表示するというスクリプトを書いています。

このスクリプトでは、バックグラウンドで実行したコマンドの終了ステータスを取得したいのですが、以下のコードだと display_progressbar の終了ステータスが返されてしまうので、どうにかして display_progressbar の中で終了ステータスを取得して、それをreturnしたい。

現在のソースコード

#!/bin/bash
# coding: utf-8

display_progressbar() {

    while :
        do
        # before display progressbar, exec "command &"
        jobs %1 >> .joblog 2>&1


        if [ $? != 0 ]; then
            # ↓↓↓ 問題のある場所 ↓↓↓
            code=`cat .joblog | python -c "import sys;c=sys.stdin.read();print c.split('\\n')[-3].split()[2]"`
            break
        fi

        for char in '|' '/' '-' '\'; do
          echo -n $char
          sleep 0.1
          printf "\b"
        done
    done;
    rm .joblog
    return $code
}

sample() {
    sleep 3
    return 10
}

sample &
display_progressbar
echo "progressbar exit with: $?"

試したこと

上記のコードでは、jobs %1で出力されるデータを.joblogというファイルに保存して、それをPythonで加工して終了ステータスを取得してます。シェルスクリプトなのでPythonに頼りたくないのですが、なにか方法はありますでしょうか?

ちなみに.joblogの中身はこうなっています。9行目の10という文字を取得しています。

[1]+  Running                 sample &
[1]+  Running                 sample &
[1]+  Running                 sample &
[1]+  Running                 sample &
[1]+  Running                 sample &
[1]+  Running                 sample &
[1]+  Running                 sample &
[1]+  Running                 sample &
[1]+  Exit 10                 sample
test.sh: line 11: jobs: %1: no such job


よろしくお願いします。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 3

checkベストアンサー

+1

以下のコードだと display_progressbar の終了ステータスが返されてしまうので

ずっとこの部分がよくわからなかった(現状でpython使ってsampleの戻り値 10はとれているような気がしている)んですが、

シェルスクリプトなのでPythonに頼りたくないのですが

が、現在pythonでやってるのをshellscriptにしたいということなのかなと判断して書いてみました。
見当はずれだったらすいません。

code=`tail -2 .joblog | head -1 | cut -d\\  -f4`

としてみてはどうでしょうか。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/08/06 10:19

    このような方法が知りたかったです!
    ありがとうございました!

    キャンセル

  • 2016/08/06 10:41

    あっててよかったです。
    考えてみればcatせずにいきなりtailでいいですね

    code=`tail -2 .joblog | head -1 | cut -d\\ -f4`

    回答の方も修正しておきます。

    キャンセル

+1

こんな感じでしょうか。

display_progressbar() {
    while test -d /proc/$1
    do
        for char in '|' '/' '-' '\'; do
          echo -n $char
          sleep 0.1
          printf "\b"
        done
    done;
}

sample() {
    sleep 3
    return 10
}

( sample ; echo $? > .status) &
display_progressbar $!
echo "progressbar exit with: " `cat .status`
rm .status

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

waitを使うのはどうでしょうか?
プロセスIDでプロセスIDの終了を待ち合わせたあとにそのプロセスの戻り値を取得できます。

#!/bin/bash

job_bg(){
    for i in $(seq 1 10)
    do
        sleep 1
        echo -n "."
    done
}

job_bg &
job_bg_pid=$!
wait $job_bg_pid
echo $?

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

同じタグがついた質問を見る

  • sh

    343questions

    shは、UNIX系OSのシェル操作の1つであり、最も基本的なシェルのことです。