如何自动退出当前复制过程?

如何自动退出当前复制过程?

我正在尝试将内容从源文件夹复制到已安装的目标文件夹。我所做的是通过将 ip 提供给 来安装 4 个设备/etc/fstab

//192.168.100.1/C1 /media/Client_1 smbfs guest 0 0

//192.168.100.2/C2 /media/Client_2 smbfs guest 0 0

//192.168.100.2/C3 /media/Client_3 smbfs guest 0 0

//192.168.100.2/C4 /media/Client_4 smbfs guest 0 0

然后通过使用 python 脚本,我尝试将文件复制到所有 Client_1、Client_2、3 和 4 文件夹。下面一行用于将文件复制到已安装的文件夹。

os.system("cp -f sourcepath/* /media/C1" %locals())
os.system("cp -f sourcepath/* /media/C2" %locals())
like C3 and C4 folders

文件移动正常。但是,问题是如果在复制内容时发生任何网络问题,脚本将不会移动到下一行,该过程正在等待网络恢复。在 4 个已安装的设备中,如果假设 C2 出现问题,脚本将终止 c2 并尝试将内容移动到 c3 和 c4。我在这个地方苦苦挣扎。如果你知道的话请告诉我。

注意:我可以理解 -f 表示强制,如果无法打开现有目标文件,请将其删除并重试。我需要使用什么参数将内容复制到已安装的文件夹,如果发生任何网络问题,则需要终止该复制文件夹。

答案1

尽管我很喜欢 Python,但这种情况其实并不需要它。这里的问题是,当 SMB 连接失败时,cp 操作会冻结而不是终止。Python 和 Bash 都无法检测到这种情况。

因此,你可以同时启动所有作业

user@host:~$ for dest in /media/Client_{1,2,3,4}; do cp -f sourcepath/* $dest & done

但这可能会堵塞你的网络。更好的选择可能是让 cp 运行一段预期的持续时间,然后在它冻结时将其终止

user@host:~$ for dest in /media/Client_{1,2,3,4}; do timeout -k 9 30m cp -f sourcepath/* $dest; done

如果命令挂起,则 30 分钟后将使用(信号 9)终止该cp命令。SIGKILL

然而,如果经常需要重新启动传输,您可能需要使用rsync而不是cp,它将检查已经复制的内容并从那里恢复。

相关内容