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

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

新規登録して質問してみよう
ただいま回答率
85.50%
sh

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

Q&A

解決済

3回答

2754閲覧

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

Alice1017

総合スコア24

sh

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

0グッド

0クリップ

投稿2016/08/05 15:23

編集2016/08/05 15:24

お世話になります。

###前提・実現したいこと

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

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

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

###現在のソースコード

sh

1#!/bin/bash 2# coding: utf-8 3 4display_progressbar() { 5 6 while : 7 do 8 # before display progressbar, exec "command &" 9 jobs %1 >> .joblog 2>&1 10 11 12 if [ $? != 0 ]; then 13 # ↓↓↓ 問題のある場所 ↓↓↓ 14 code=`cat .joblog | python -c "import sys;c=sys.stdin.read();print c.split('\\n')[-3].split()[2]"` 15 break 16 fi 17 18 for char in '|' '/' '-' '\'; do 19 echo -n $char 20 sleep 0.1 21 printf "\b" 22 done 23 done; 24 rm .joblog 25 return $code 26} 27 28sample() { 29 sleep 3 30 return 10 31} 32 33sample & 34display_progressbar 35echo "progressbar exit with: $?" 36

###試したこと

上記のコードでは、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

よろしくお願いします。

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

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

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

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

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

guest

回答3

0

こんな感じでしょうか。

Bash

1display_progressbar() { 2 while test -d /proc/$1 3 do 4 for char in '|' '/' '-' '\'; do 5 echo -n $char 6 sleep 0.1 7 printf "\b" 8 done 9 done; 10} 11 12sample() { 13 sleep 3 14 return 10 15} 16 17( sample ; echo $? > .status) & 18display_progressbar $! 19echo "progressbar exit with: " `cat .status` 20rm .status

投稿2016/08/05 22:13

otn

総合スコア84423

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

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

0

ベストアンサー

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

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

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

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

sh

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

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

投稿2016/08/05 17:07

編集2016/08/06 01:42
flied_onion

総合スコア2604

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

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

Alice1017

2016/08/06 01:19

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

2016/08/06 01:41

あっててよかったです。 考えてみればcatせずにいきなりtailでいいですね code=`tail -2 .joblog | head -1 | cut -d\\ -f4` 回答の方も修正しておきます。
guest

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 $?

投稿2016/08/05 16:45

nullbot

総合スコア910

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問