Javascript node js-检测并防止重复进程

Javascript node js-检测并防止重复进程,javascript,node.js,Javascript,Node.js,在一次只希望应用程序的一个实例运行的情况下,如何检测并防止代码库运行两次 目前,我的代码是从命令行启动的,我打算在应用程序运行并发出命令时,将向先前存在的实例发送一条消息,如注释中所述,停止创建同一进程的一种方法是创建一个锁文件。此文件通常不包含任何内容,但您可以在其中放置任何所需内容。我们只需要知道该文件是否存在 const fs = require('fs') const path = require('path') // Create the path to the lock file

在一次只希望应用程序的一个实例运行的情况下,如何检测并防止代码库运行两次


目前,我的代码是从命令行启动的,我打算在应用程序运行并发出命令时,将向先前存在的实例发送一条消息,如注释中所述,停止创建同一进程的一种方法是创建一个
文件。此文件通常不包含任何内容,但您可以在其中放置任何所需内容。我们只需要知道该文件是否存在

const fs = require('fs')
const path = require('path')

// Create the path to the lock file
const lockFile = path.join(__dirname, './lock')
// Test the lock file
const lock = fs.statSync(lockFile)

if (lock.isFile()) {
  // The file already exists, exit the process
  process.exit()
} else {
  // The file does not exist, let's create it
  fs.writeFileSync(lockFile, '')

  // Before the application quits, remove the lock file
  process.on('beforeExit', () => fs.unlinkSync(lockFile))
}
锁文件的缺点是,如果应用程序崩溃,
lock
文件将不会被删除,需要手动删除


注意:进程.on()需要在
else
中,否则退出的应用程序可能会删除该文件。

在启动时创建一个锁定文件,并检查它是否存在。当应用程序退出时,您也需要删除该文件。这看起来不错,但我建议进行一些增强:a)将锁文件写入操作系统的临时目录,而不是乱扔应用程序文件夹;b)在进程运行时保持对该文件的锁定,以便其他进程无法删除它(当前代码使用“创建并忘记”方法)。此外,处理
uncaughtException
exit
怎么样?OP可能在别处调用了
process.exit()
。按照@Vasan的建议,如果您打开文件进行写入(而不仅仅是
stat()
),那么您将有效地获得一个锁,如果您的进程异常终止,该锁将过期。(传统上,人们会将所属进程的PID写入文件,以便其他工具可以在需要时终止该进程。)@DavidW您会执行
fs.createWriteStream(path_to_file)
,编写PID并只执行
.end()
,然后在终止后删除该文件吗?@jasonalan是的,基本上就是这么简单。并且
createWriteStream()
失败(无法打开文件进行写入)表示另一个进程正在运行。