(親の)スクリプト内で(親と子の)スクリプトが実行中か判定する方法はないでしょうか。
多分やろうとしていることは次のようなことではないでしょうか?
- cronで一定時間ごとにスクリプト(parent_script.sh)を実行している
- 存在チェックしたいのは自分自身のプロセスおよび自分の子供プロセスではない
そうではなくてcronで前回起動した同名のスクリプトがまだ実行中かどうかをチェックしたいのでは?
こう思ったのはご質問に書かれているスクリプトの内容からです。
if [ -n $(ps aux |grep 'parent_script.sh' |grep -v "$(date +'%H:%M')") ] then;
プロセス一覧から'parent_script.sh'を含むプロセスを探そうとしていますよね・・・
これがうまくいかない原因は「自分自身」および「調べるために実行しているgrepコマンド」もgrepにひっかかる点と、日付という曖昧な情報を用いているためと思います。KojiDoiさん回答オプションなどで親プロセスIDを表示できるので、それに基づきプロセスの親子関係を用いた絞り込みを行えばよい気がします。
例えば以下の条件をawkなどで絞り込めば望みのプロセスが選び出せるのではないでしょうか?
- PPIDが自分の親と同じ
cronデーモンのプロセスがそうなると想定してますが実際に確認したわけではないです。確認してみてください。この条件によりチェックのために起動したgrepコマンドは自動的に除外されます。
- PIDが自分自身ではない
言うまでもなく今まさに実行しているスクリプト自身を除外するためです。
- 自分と同じスクリプト名を含む
bash
1$ cat ck.sh
2#!/bin/bash
3echo my pid is $$
4ps -e -o ppid,pid,command |
5 awk -v ppid=$PPID -v pid=$$ '$1 == ppid && $2 != pid && /ck.sh/'
6sleep 30
7$ chmod +x ck.sh
8$ ./ck.sh &
9[1] 100
10my pid is 100
11$ ./ck.sh &
12[2] 105
13my pid is 105
142 100 /bin/bash ./ck.sh <===これが前回起動したプロセス
15$
最初の起動では該当プロセスがなく、次の起動で直前のスクリプトが実行中であることが検出できていると思います。
(ちなみにわかりやすくするためstdoutは若干整形してます。)
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/01/21 12:46 編集
2018/03/10 03:07