当 CIFS 共享不可用时如何停止服务?

当 CIFS 共享不可用时如何停止服务?

我有一个由脚本启动的服务/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

相关内容