我有一个由脚本启动的服务/etc/init.d/foo
。当某个 CIFS 共享 ( //fileserver/multimedia on /home/username/multimedia type cifs
) 由于任何原因(卸载、网络中断、宇宙射线等)不可用时,我希望该服务foo
自动停止。当共享再次可用时,我希望该服务自动foo
(重新)启动。我对“可用”的标准是:能够访问共享上的文件。
我怎么做?
答案1
我对“可用”的标准是:能够访问共享上的文件。
您可以像这样在挂载点上创建一个测试文件:
touch /home/username/multimedia/testfile
然后运行一个 bash 脚本,每 60 秒检查一次该测试文件的可访问性,如下所示:
#!/bin/bash
# Set the full path to the test file between " " in the next line
file="/home/username/multimedia/testfile"
while true; do
if [ -f "$file" ]; then
echo "File is available"
# Your command/s here when the files on the mount are accessible.
elif [ ! -f "$file" ]; then
echo "File is NOT available"
# Your command/s here when the files on the mount are NOT accessible.
fi
sleep 60
done
答案2
根据@Raffa 接受的答案的最终解决方案:
#!/bin/bash
file_list="/home/amedee/bin/file_list.txt"
all_files_exist () {
while read -r line; do
[ -f "$line" ]
status=$?
if ! (exit $status); then
echo "$line not found!"
return $status
fi
done < "$file_list"
}
start_crashplan () {
echo "Starting CrashPlan"
#/etc/init.d/code42 start
}
stop_crashplan () {
echo "Stopping CrashPlan"
#/etc/init.d/code42 stop
}
while true; do
if all_files_exist; then
echo "All files are available"
start_crashplan
else
echo "Not all files are available"
stop_crashplan
fi
sleep 60
done
- 我想测试多个共享,因此我将文件测试移到了函数中
all_files_exist
。 file_list.txt
包含我想检查的不同共享上的 s 列表testfile
。它们都必须存在,即使只有一个缺失或无法访问,也必须停止服务。
/home/amedee/Downloads/.testfile
/home/amedee/Multimedia/.testfile
/home/amedee/backup/.testfile
- 我可以添加或删除共享而不需要修改脚本,我只需要编辑
file_list.txt
- 即使脚本仍在运行。 - 如果服务已经启动(或停止),则启动(或停止)该服务是完全可以的。实际的启动脚本本身会检查它是否已经启动(或停止)。
- 这是我以非特权用户身份进行调试时使用的版本。在我的实时版本中,我取消了注释行
/etc/init.d/
,并删除了echo
除 之外的所有行echo "$line not found!"
。启动脚本已经提供了足够的控制台输出,并且通过使用函数,我已经使脚本非常易于阅读。您只需阅读while true
底部的循环即可了解发生了什么。 - 此脚本需要在启动时以 root 身份运行,因此我从 cron(
sudo crontab -u root -e
) 中调用它:
@reboot /home/amedee/bin/test_cifs_shares.sh