问题描述
我有两个从同一文件读取的进程。我想确保这两个进程不会同时运行。我的方法是,当一个进程启动时,它应该寻找一个文件(process.txt)。如果该文件不存在,它将创建文件并继续执行,从两个进程之间的共享文件(sharedfile.txt)中读取。执行后,它将删除process.txt文件。
由于两个进程都在执行后删除了process.txt文件,因此如果该文件存在,则应进入睡眠状态,直到另一个进程完成并删除该文件。
这里的问题是,当一个进程完成并删除文件(process.txt)时,即使没有文件存在,另一个进程也仍然停留在循环中而不执行。我不确定使用正确的循环。我尝试了其中的几个,但达不到我的目标。
Clear Host
$sleeptime = 15
$lockfile = "C:\Users\processid.txt"
$file = test-path -Path $lockfile
Try
{
if($file -eq 'True')
{
echo “Lock file found!”
echo "This means file is being used by another process"
echo "Wait for file to be deleted/released"
echo “Sleeping for $sleeptime seconds”
Start-Sleep $sleeptime -Verbose
}
else
{
New-item -Path $lockfile
#Executing a code here
}
Remove-Item $lockfile –Force
}
}
Catch
{
Write-Host $_.Exception.Message`n
}
解决方法
您可以使用while循环
Clear Host
$sleeptime = 15
$lockfile = "C:\Users\processid.txt"
While(Test-Path -Path $lockfile)
{
Write-Host "Lock file found!"
Write-Host "This means file is being used by another process"
Write-Host "Wait for file to be deleted/released"
Write-Host "Sleeping for $sleeptime seconds"
Start-Sleep $sleeptime -Verbose
}
try
{
New-item -Path $lockfile
#Executing a code here
Remove-Item $lockfile –Force
}
catch
{
Write-Host $_.Exception.Message`n
}
,
考虑这一点,它创建一个锁文件并打开它以进行独占访问。让我们运行脚本,然后进行清理。如果无法获得访问权限,则会等待5秒钟,然后重试。
在两个脚本中都使用此命令应使它们播放流畅并等待回合。如果由于某种原因留下了一个锁定文件(计划外重启会中止脚本或类似操作),那么该文件仍然可以正常工作。
// these update normal
dashT.startedCoaching = Date.now();
dashT.lockedEmojiInteractionGroups = ['selectStudent'];
dashT.studentQTicketID = qTicket.id;
/** @type {[{value: import('../Models/Queue_Pool.js').QPE_Opts},{value: Message}]} */
const [{ value: queuePoolEntry },{ value: answer }] = await Promise.allSettled([
Queue_PoolEntry.findOne({ id: qTicket.id }),qTicket.coach.send(studentMessage(qTicket)),updateAllDashboards(),]);
dashT.delMsgPool.push(answer.id);
//dashT now has the id inside of delMsgPool
console.log(POOLS);
// POOLS.DashTicket_Pool[dashId].delMsgPool is still [] ... the other values are on the object
// though
您还可以更进一步,而是锁定实际使用的文件,但是由于文件对任何cmdlet都会被锁定,因此您需要从文件流中读取文件。