ところが、スクリプトの先頭行にある「#!/bin/sh」が無い場合、システムが認識しているコマンドラインが変化し、うまくPIDを取得できなかった。
次のようにスクリプトを作成して、単独で実行し、変数などの値を調べた。
#!/bin/sh
echo "PID is $$"
cmdline=`/bin/cat /proc/$$/cmdline`
echo "/proc/$$/cmdline is $cmdline"
echo "PATH is $0"
psnum=`pgrep -fo "$0"`
echo "pgrep -fo $0 is $psnum"
###
if [ "$$" != "$psnum" ] ; then
echo "no"
exit 1
fi
echo "ok"
このスクリプトの実行結果は次のようになった。
# /root/Python/webtest/com/test0.sh
PID is 3564スクリプト内で$$変数によって取得したPIDと、pgrepコマンドに$0を与えて取得したPIDが一致している。
/proc/3564/cmdline is /bin/sh/root/Python/webtest/com/test0.sh
PATH is /root/Python/webtest/com/test0.sh
pgrep -fo /root/Python/webtest/com/test0.sh is 3564
ok
そのため、条件分岐せずに、ok と表示された。これは意図した動作である。
一方、スクリプトの先頭行から、#!/bin/sh を外して実行した場合、実行結果は次のようになった。
# /root/Python/webtest/com/test0.sh
PID is 3560実行済コマンドラインが「-bash」となっている。
/proc/3560/cmdline is -bash
PATH is /root/Python/webtest/com/test0.sh
pgrep -fo /root/Python/webtest/com/test0.sh is
no
そのため、pgrepコマンドに$0を与えても、PIDを取得することができなかった。
意図した動作をしない。
<参考>
・/bin/sh と /bin/bash の違い
< http://sechiro.hatenablog.com/entry/20120806/1344267619 > 2017年6月27日