进程何时获取要读取的文件

When does a process acquire a file to read

我有一个脚本,可以从输入文件中逐一获取服务器列表,然后在每台服务器上执行一些命令。我希望能够在此脚本 运行ning 期间更新输入文件,而不影响第一个进程的输入,并使用第二个服务器列表重新 运行 脚本。这可以安全地完成吗?

假设您的进程是 运行ning,如果您想更改文件,只需将文件 mv 放在一边并复制新的输入文件。这样,如果进程没有将输入文件完全读入内存,它仍然会有一个文件描述符打开到前一个文件并且 运行 不受影响。当然这一切都取决于进程是如何实现的,如果它在执行过程中尝试重新打开文件,它将看到新的文件内容。

process inputfile
mv inputfile inputfile.running
mv newinput inputfile

当您 运行 像 file > my_script 这样的命令时,位于 file 的内容将通过管道传输到 my_script(作为 file descriptor)。这将内容与名称分离,这意味着您可以立即 modify/replace file 在另一个进程中。

如果您改为 运行 类似 my_script file 的命令,您会将 name "file" 传递给 my_script,这可以随时读取该文件(或写入、删除等),因此当脚本处于 运行ning 时,您无法安全地更改 file。值得注意的是,这不会立即发生;一个漫长的 运行ning 过程可能不会从 file 读取,直到很久以后,在您已经编辑了文件之后。

因此,如果您将程序设计为从 stdin 读取,您可以安全地修改输入文件并在第一个进程仍在 运行ning 时重新 运行 命令。