这是一个假设场景。假设我有一个特定的文件夹,该文件夹正在由通过互联网接收文件/文件夹的进程同步。现在,当此操作正在进行时,为了同步器的缘故,不应对其目录进行 cp 操作。无论如何,这可以实现吗?
答案1
至少有两种可能的解决方案:
- 为 cp 创建一个包装器脚本,通过检查进程是否正在运行或测试锁定文件来检查同步是否正在运行,然后中止或延迟操作。
- 用于
LD_PRELOAD
挂断电话write
和其他呼叫。
第一个解决方案的问题是,您必须将用于写入文件夹的所有命令包装起来,例如,,,,,,mv
……另一方面,它非常简单,但也仅适用于您当前的用户。cp
rsync
rm
ln
cat
对于第二个解决方案,您必须编写一个共享库,其中包含用于更改/修改目录的所有系统调用,例如write
, unlink
, rename
。但该解决方案适用于所有动态链接的可执行文件 - 因此无需调整其他所有程序。
答案2
如果您知道同步进程正在运行并且知道唯一可能的操作是cp
,那么您可以SIGSTOP
向所有进程发送消息以暂停执行。同步完成后,您发送SIGCONT
到所有进程以继续。
为此,您可以使用kill -s SIGSTOP $(pidof cp)
或killall -s SIGSTOP cp
。在终端中,您可以使用Ctrl+Z将任务置于后台(“暂停”)。要继续执行,请使用fg
命令(“前台”,请参阅help fg
)。
答案3
您的同步器正在写入目录而不是读取,对吧?因此,拍摄文件系统快照或设置不可变位已经过时了。
如果您以 root 身份运行同步器,则可以将目录的所有权更改为 root,并将权限更改为 700(rwx-----;只有所有者可以执行任何操作)。这将阻止任何不以 root 身份运行的新进程,但任何已打开文件或子目录的进程仍然能够进行更改。
在 Linux 上,如果您想查找树中当前打开文件的所有进程,您可以执行lsof +D my_directory
.然而,你用这些知识做什么取决于具体情况。