投げ銭

★当サイトへの投げ銭(PayPal)★

LINK


(無償)
logo
世界中で使われるISO標準オフィスソフト(MSオフィス互換)
The Document Foundation Wiki

人気の投稿(1ヶ月間)

Ad

Ad

投げ銭

★当サイトへの投げ銭(PayPal)★

2017年6月27日火曜日

【Linux CentOS 6 64bit】スクリプトの「#!/bin/sh」の有無とシステムが認識するコマンドラインの関係について

pgrepコマンドで、実行済コマンドラインを与えることで、そのプロセスID (PID)を取得したかった。

ところが、スクリプトの先頭行にある「#!/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
/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
スクリプト内で$$変数によって取得したPIDと、pgrepコマンドに$0を与えて取得したPIDが一致している。
そのため、条件分岐せずに、ok と表示された。これは意図した動作である。



一方、スクリプトの先頭行から、#!/bin/sh を外して実行した場合、実行結果は次のようになった。
# /root/Python/webtest/com/test0.sh
PID is 3560
/proc/3560/cmdline  is  -bash
PATH  is  /root/Python/webtest/com/test0.sh
pgrep -fo /root/Python/webtest/com/test0.sh  is
no
実行済コマンドラインが「-bash」となっている。
そのため、pgrepコマンドに$0を与えても、PIDを取得することができなかった
意図した動作をしない。



<参考>
・/bin/sh と /bin/bash の違い
< http://sechiro.hatenablog.com/entry/20120806/1344267619 > 2017年6月27日

投げ銭

★当サイトへの投げ銭(PayPal)★

Ad

Ad