进程何时获取要读取的文件
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 时重新 运行 命令。
我有一个脚本,可以从输入文件中逐一获取服务器列表,然后在每台服务器上执行一些命令。我希望能够在此脚本 运行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 时重新 运行 命令。