Bashスクリプトは通常、他のスクリプトを呼び出すことはできません。

Bashスクリプトは通常、他のスクリプトを呼び出すことはできません。

起動時にinit.dスクリプトから呼び出されるbashスクリプトがあります。このスクリプトを複数回再起動する必要があるため、スクリプトが機能していることを確認する中間ファイルを生成します。私の問題は、init.dスクリプト(bashに少し新しいものなので、これが技術的にスクリプトと呼ばれるかどうかはわかりません)によって呼び出されたスクリプト内で、「スクリプト」が実際の作業を実行する別のスクリプトを呼び出すことです。実行されず、エラーは発生しません。 checkversion.sh arg1 arg2 です。エラーが発生しないファイルにstderr出力をパイプしました。意図的に間違ったファイルパスを入力した場合、これが発生します。スクリプトを呼び出した後、いくつかの出力ファイルを使用していることがわかります。これらのファイルはアクセスできるように正しく入力されています。私は明らかなものを見逃していますか?

基本構造:/etc/init.d/myupdateは/usr/bin/databases/runcheckversion.shを呼び出し、最後に/usr/bin/databases/checkversion.shを呼び出しますが、checkversion.shは決して実行されません。出力されません。 。これがPATH仕様に関連している可能性があると思いますか?

/etc/init.d/myupdate コード:

#! /bin/sh
### BEGIN INIT INFO
#Provides: myupdate
### END INIT INFO

PATH=/sbin:/bin:/usr/sbin:/usr/bin

case "$1" in
    start)
         /usr/bin/databases/runcheckversionwithupdate.sh
         ;;
    stop|restart|reload)
         ;;
esac

/usr/bin/databases/runcheckversion.sh コード:

#! /bin/sh

after_reboot()
{
   versionNumber=$(< /usr/bin/databases/afterreboot.txt);
   #This following command never executes and theres no error output
   sudo /usr/bin/databases/checkversion.sh $versionNumber /usr/bin/databases/my.db.sqlite 2> didntwork.txt 
  ((versionNumber++));
  echo $versionNumber>/usr/bin/databases/afterreboot.txt;  
}




if [ -f /usr/bin/databases/afterreboot.txt ]; then
    sleep 20
    after_reboot
    checkVersion=$(< /usr/bin/databases/afterreboot.txt)
    if(($checkVersion < 2)); then
    sudo reboot
    fi
    echo "DONE"
else
  echo "1">/usr/bin/afterreboot.txt;
  echo "worked"
  sudo reboot
fi

答え1

after_reboot() 関数を呼び出す前に存在するかどうかを確認するファイルは、/usr/bin/databases/afterreboot.txt

ただし、1をエコーし​​たいファイル(上記のファイルがない場合)は/usr/bin/afterreboot.txtです。

したがって、1つのファイル(/usr/binに)を作成し、別のファイル(/usr/bin/databasesに)を確認するようです。

以下が機能する可能性があります。

#! /bin/sh

after_reboot()
{
   versionNumber=$(< /usr/bin/databases/afterreboot.txt);
   #This following command never executes and theres no error output
   sudo /usr/bin/databases/checkversion.sh $versionNumber /usr/bin/databases/my.db.sqlite 2> didntwork.txt 
  ((versionNumber++));
  echo $versionNumber>/usr/bin/databases/afterreboot.txt;  
}




if [ -f /usr/bin/databases/afterreboot.txt ]; then
    sleep 20
    after_reboot
    checkVersion=$(< /usr/bin/databases/afterreboot.txt)
    if(($checkVersion < 2)); then
    sudo reboot
    fi
    echo "DONE"
else
  echo "1">/usr/bin/databases/afterreboot.txt;
  echo "worked"
  sudo reboot
fi

関連情報