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

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

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

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

シェル

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

Q&A

解決済

3回答

5100閲覧

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

2980jun

総合スコア13

Linux

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

シェル

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

0グッド

0クリップ

投稿2016/04/10 11:00

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

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

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

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

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

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

./child.sh & echo $? 結果:「0」が表示される

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

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

###最終的にしたいこと

最終的には、バックグラウンドで起動できたかを変数に代入して その変数を使用して条件分岐をしたいです。 ① バックグラウンドで子シェルを実行 ② ①の処理が正しく実行できたか判定 ├実行できた場合・・・後続の処理を実行 └実行できなかった場合・・・処理を強制終了する

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

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

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

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

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

guest

回答3

0

ベストアンサー

① バックグラウンドで子シェルを実行

② ①の処理が正しく実行できたか判定
├実行できた場合・・・後続の処理を実行
└実行できなかった場合・・・処理を強制終了する

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

Bash

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

投稿2016/04/10 12:55

otn

総合スコア84423

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

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

2980jun

2016/04/18 14:45

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

0

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

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

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

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

投稿2016/04/10 13:13

mpyw

総合スコア5223

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

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

2980jun

2016/04/18 14:50

解決策のご提示ありがとうございます。 「最終的にしたいこと」が抽象的ですみません。。。 今回はotnさんの例を参考に解決することができました。
guest

0

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

投稿2016/04/10 12:06

takasima20

総合スコア7458

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

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

2980jun

2016/04/18 14:52

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問