シェルの代わりに実行中のスクリプトのPIDをどのように取得できますか?

シェルの代わりに実行中のスクリプトのPIDをどのように取得できますか?

実行には./run_func_and_get_pid.sh次のものがあります。

#!/bin/bash

run () {
    while true
    do
        "$@" & echo -n $! > duh && echo "" `cat duh` `cat dih`
        sleep 5
    done
}

run echo -n my name is mudd & echo -n $$ > dih

出力

my name is mudd 392056 392054
my name is mudd 392060 392054
my name is mudd 392066 392054
my name is mudd 392070 392054
my name is mudd 392074 392054
my name is mudd 392082 392054
my name is mudd 392087 392054
my name is mudd 392091 392054
my name is mudd 392095 392054
my name is mudd 392122 392054
my name is mudd 392126 392054
my name is mudd 392130 392054
my name is mudd 392134 392054
my name is mudd 392139 392054
my name is mudd 392143 392054
my name is mudd 392147 392054
my name is mudd 392151 392054
my name is mudd 392160 392054
my name is mudd 392164 392054
. . .

これ郵便はがきこれは392054pidであると提案しましたが、run_func_and_get_pid.sh後で見つけました。

$ ps aux | grep run_func
. . .
user   392055  0.0  0.0   9632  1852 pts/5    S    09:51   0:00 /bin/bash ./run_func_and_get_pid.sh
user   398763  0.0  0.0   9040  2508 pts/6    S+   10:10   0:00 grep -I --color=auto run_func

$ ps aux | grep 392054
user   398975  0.0  0.0   9040   720 pts/6    S+   10:13   0:00 grep -I --color=auto 392054

私はこれが392054コマンドを実行したときに生成されるbashシェルであると推測できます。プロセスは何でも終了しました。

スクリプトの親ではなく、実行中のスクリプトのPIDをどのように取得しますか?

ベストアンサー1

これ:

run ... & echo ...

バックグラウンドで実行する新しいシェルプロセスをフォークしてから、runを使用しますecho。後者は長い間実行されていないため、基本スクリプトはかなり迅速に終了し、すでに$$終了しているプロセスを指します。

回答バージョンはバックグラウンドプロセスを開始しないためrun(実際には何の理由もなく)、基本スクリプトと同じプロセスで実行されます。

より簡単な例については、以下を試してください。

#!/bin/bash
echo "main script: $$"
f() {
    sleep 5;
    echo "bg job: $BASH_PID"
    ps "$BASH_PID";
}
f &

だから:

$ bash bg.sh; sleep 3
main script: 32553
bg job: 32554
  PID TTY      STAT   TIME COMMAND
32554 pts/1    S      0:00 bash bg.sh

おすすめ記事