我有一个 bash 脚本,在启动时从 init.d 脚本调用。我需要为此脚本进行多次重新启动,因此我正在创建一个中间文件,用于检查脚本是否应该工作。我的问题是,在 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
因此,看起来您正在创建一个文件(在 /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