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

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

ただいまの
回答率

90.47%

  • Linux

    3907questions

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

  • シェル

    251questions

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

shell script バックグラウンド コマンド実行判定

解決済

回答 3

投稿

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

2980jun

score 5

前提・実現したいこと

子シェルをバックグラウンドで実行した場合、
起動ができたかどうかを確認する方法についてご教授ください。

子シェルをバックグランドで実行した際、
実行できたかどうかを「$?」を使用してできると思っていたのですが、
実際に試してみたところ、できませんでした。

子シェルが実行できた場合は「$?」に「0」が入るのですが、
子シェルが実行できなかった場合も「$?」に「0」が入ってしまいます。

子シェルを起動できたかどうかを確認する方法がございましたらご教授ください。

子シェル(child.sh)が実行できた場合

./child.sh &
echo $?

結果:「0」が表示される

子シェル(child.sh)が実行できなかった場合(シェル名間違い)

./chld.sh &
echo $?

結果:「-bash: ./chld.sh: そのようなファイルやディレクトリはありません」と表示され「0」が表示される

最終的にしたいこと

最終的には、バックグラウンドで起動できたかを変数に代入して
その変数を使用して条件分岐をしたいです。

① バックグラウンドで子シェルを実行
② ①の処理が正しく実行できたか判定
  ├実行できた場合・・・後続の処理を実行
  └実行できなかった場合・・・処理を強制終了する
  • 気になる質問をクリップする

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 3

checkベストアンサー

+3

① バックグラウンドで子シェルを実行
② ①の処理が正しく実行できたか判定
  ├実行できた場合・・・後続の処理を実行
  └実行できなかった場合・・・処理を強制終了する

コマンドがエラー終了したかどうかではなく、起動できたかどうか、ということですよね?
「起動できるかどうかわからないコマンドラインをバックグラウンドで実行して・・・」というところから、間違っていると思います。実行前に確認します。

CMD=./child.sh
if ! type "$CMD" >/dev/null 2>/dev/null
then echo 実行できない
     exit 1
fi
$CMD &
後続処理

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2016/04/18 23:45

    ご返信遅くなってしまい申し訳ございません。
    回答していただいた内容で解決できました!!
    ご回答ありがとうございました。

    キャンセル

+1

ファイル名を間違えても確実にサブシェルは起動します.よってこれは正しい挙動です.

「サブシェルが起動できたか」ではなく「サブシェルで指定したコマンドが実行できたか」が求めているものですよね?でしたらotnさんの例のようにtypeであらかじめ実行可能かを確かめておくべきです.

もし「サブシェルで指定したコマンドが実行でき,かつステータス0で終了したか」を確かめたい場合は,後続の処理もサブシェルに入れる,あるいはサブシェルをそもそも使わないようにする,などの解決策があるでしょう.

「最終的にしたいこと」がまだまだ抽象的なので,提示できるのはこれぐらいです…

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2016/04/18 23:50

    解決策のご提示ありがとうございます。
    「最終的にしたいこと」が抽象的ですみません。。。

    今回はotnさんの例を参考に解決することができました。

    キャンセル

0

psコマンドの結果をプロセス名や自プロセスIDあたりで引っ掛けて
該当プロセスIDを取得できるかで判断でするのかなあ。
それが取れれば、その処理が終了するまで待ち合せる
なんてこともできますね。(要タイムアウトの仕掛け)

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2016/04/18 23:52

    ご回答ありがとうございます。
    psコマンドもいろいろ使い方がありますね。。
    初心者なので分からないことだらけです。。。

    キャンセル

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

  • ただいまの回答率 90.47%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

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

  • Linux

    3907questions

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

  • シェル

    251questions

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