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

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

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

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

Linux

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

Q&A

2回答

1149閲覧

LinuxとBSDで jobs -p の挙動が異なる

miminashi

総合スコア22

シェルスクリプト

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

Linux

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

0グッド

1クリップ

投稿2018/08/06 22:55

sh

1#!/bin/sh 2echo 'c.sh' 3 4term() { 5 jobs -p 6 jobs=$(jobs -p) 7 echo ${jobs} 8 kill ${jobs} 9} 10trap 'term' 1 2 3 15 11 12tail -f hoge | 13while read l; do 14 date 15 sleep 1 16done & 17 18wait

このシェルスクリプトを起動すると、以下のようにプロセスが立ち上がります。

shell

1$ ps -ao pid,ppid,pgid,command 2 PID PPID PGID COMMAND 3 1740 1469 1740 /bin/sh ./c.sh 4 1741 1740 1740 tail -f hoge 5 1742 1740 1740 /bin/sh ./c.sh

BSD(macOS, FreeBSD)の場合はkill 1740すると、コンソールには

1741 1741

と表示されて、1741 1742 も終了してくれるのですが、Linuxの場合は

1741 ./c.sh: 8: kill: Usage: kill [-s sigspec | -signum | -sigspec] [pid | job]... or kill -l [exitstatus]

1741 1742が終了せず残り続けています。

BSDだとtrapの中で実行したjobs -pの結果を変数に格納できているのですが、Linuxだとできていないです。

なにがいけないのかよくわからず困っています。
ご助言いただけると幸いです。

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

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

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

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

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

guest

回答2

0

確認したところ、以下のようになりました。

  • macOS(bash): OK
  • CentOS(bash): OK
  • Debian(dash): NG

jobsコマンドは組み込みコマンドなので、シェルの違いが原因と思われます。

#!/bin/sh#!/bin/bashとしたらDebianでも動きました。

投稿2018/08/07 01:42

ikemo

総合スコア332

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

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

0

CentOS6.10 Bash4.1.2 ですが、再現しません。

BSD(macOS, FreeBSD)の場合はkill 1740すると、コンソールには

と同様の結果になります。

投稿2018/08/07 01:36

otn

総合スコア84529

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

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

otn

2018/08/07 02:06 編集

bashじゃなくてdashなんですね。 dash $ sleep 20 & $ jobs -p 23748 $ (jobs -p) $ サブシェルの中では、jobs -p に限らず、jobs が何も表示しません。 dashでやるなら、プロセス置換で代入するのでなく、ファイルにリダイレクトして、それを読むしかないですね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問