39 Star 222 Fork 51

chuanjiao10 / kasini3000

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
克隆/下载
u库定时任务_线程级别.ps1 9.48 KB
一键复制 编辑 原始数据 按行查看 历史
chuanjiao10 提交于 2023-08-05 15:07 . 更新:7zip库到23.01
#建议保存编码为:bom头 + utf8
#默认每小时轮换进程。每满【$global:u库_线程级别_定时任务_最大并发线程数_单进程】,轮换进程。
#$PSModuleAutoloadingPreference = 0
Start-Sleep -Seconds 1
Remove-Module -Name psreadline
if ($global:u库_线程级别_定时任务_启用 -eq $false)
{
Write-Error "错误:没有启用线程级别,定时任务。错误码3`n请修改config.ps1"
exit 3
}
Import-Module -Name 'PoshRSJob'
if ((Get-Module -Name poshrsjob) -eq $null)
{
& 'k_写log.ps1' -被写入的log内容 "u库定时任务_线程级别.ps1 错误:未安装PoshRSJob模块。退出码989"
Write-Warning "信息:powershell v7.x,请把【c:\ProgramData\kasini3000\lib\kasini3000\ProgramFiles_WindowsPowerShell_Modules】目录下的所有目录,复制到【c:\Program Files\PowerShell\Modules】"
Write-Warning "信息:powershell v5.x,请把【c:\ProgramData\kasini3000\lib\kasini3000\ProgramFiles_WindowsPowerShell_Modules】目录下的所有目录,复制到【c:\Program Files\WindowsPowerShell\Modules】"
Write-Error '错误:未安装PoshRSJob模块。退出码989'
exit 989
}
if ( ($IsWindows -eq $True) -or ($PSVersionTable.psversion.major -lt 6) ) #win
{
& 'c:\ProgramData\kasini3000\0k_source.ps1'
}
if ($IsLinux -eq $True)
{
& '/etc/kasini3000/0k_source.ps1'
}
$global:被控机列表文件 = $global:u库_线程级别_定时任务_被控机列表文件
$global:zd只读nodelist文件 = $false
& 'zd只读nodelist文件.ps1'
& 'u库定时任务_线程级别_写pid.ps1'
try
{
$log日志文件全目录 = "${global:kasini3000_data_path}"
if (Test-Path -LiteralPath $log日志文件全目录)
{
$u库定时任务的pid文件 = "$log日志文件全目录/u库_线程级别_pid.txt"
if (Test-Path -LiteralPath $u库定时任务的pid文件)
{
$private:文件流 = New-Object System.IO.FileStream($u库定时任务的pid文件,[System.IO.FileMode]::Open,[System.IO.FileAccess]::read,[System.IO.FileShare]::none)
}
}
}
catch
{
Write-Error '错误:u库定时任务,线程级别,文件上锁失败,无法读取!返回码5'
exit 5
}
$global:u库_线程级别_定时任务_建立新进程间隔_分钟 = 60
$private:开始时间 = Get-Date
$private:开始时间2 = $private:开始时间.AddSeconds(-$开始时间.second).AddSeconds(-3)
$private:结束时间2 = $private:开始时间2.AddMinutes($global:u_线程级别_定时任务_建立新进程间隔_分钟).AddSeconds(-9) #应该小于48秒。
$private:2小时0分钟 = $private:开始时间.AddSeconds(-$开始时间.second).AddHours(2).AddMinutes(-$private:开始时间.Minute)
if ($private:结束时间2 -ge $private:2小时0分钟)
{
$private:结束时间2 = $private:2小时0分钟.AddSeconds(-9) #结束时间2,应该小于0分钟48秒。
}
$private:超时时间2 = $private:结束时间2.AddSeconds(${global:u库_线程级别_定时任务_超时}.TotalSeconds)
#main 运行时间:从57秒,到n分钟后的48秒。
Write-Error '信息:u库,线程级别,定时任务,开始运行'
Write-Verbose "信息:u库,线-程级别,定时任务进程,【$pid】开始运行。开始时间=【$private:开始时间2】,停止接受任务时间=【$private:结束时间2】,进程强制退出时间=【 $private:超时时间2】"
& 'k_写log.ps1' -被写入的log内容 "信息:u库,线-程级别,定时任务进程,【$pid】开始运行。开始时间=【$private:开始时间2】,停止接受任务时间=【$private:结束时间2】,进程强制退出时间=【 $private:超时时间2】"
#-1:未fork进程,1:已经fork进程,2:超过并发数,并已经fork进程。
$private:已经fork进程 = -1
$global:u库_线程级别_定时任务_循环中 = $True
while ($global:u库_线程级别_定时任务_循环中 -eq $True)
{
if ($global:u库_线程级别_定时任务_启用 -eq $True)
{
& 'end_invoke_u库_任务表_rs.ps1'
}
$private:现在 = Get-Date
# 超时2小时,6分钟则直接退出。
if ($private:超时时间2 -lt $private:现在)
{
$private:文件流.Dispose()
& 'u库定时任务_线程级别_删pid文件.ps1'
& 'k_写log.ps1' -被写入的log内容 "错误:u库,线-程级别,定时任务进程,【$pid】超时退出。"
Write-Error "错误:u库,线-程级别,定时任务进程,【$pid】超时退出。"
exit 1
}
if ( ($private:现在.Minute % 5 -eq 0) -and ($private:现在.Second -gt 51) )
{
Write-Verbose '开始运行 .net 垃圾回收'
[System.GC]::Collect()
[System.GC]::WaitForPendingFinalizers()
}
#region 检查是否超过并发数
$private:temp997 = & 'kdir-cmdb.ps1' -被查找的库文件名 'u库_线程级别_任务表_多线程_读取所有正运行任务数420.ps1'
if ( ($private:temp997 -eq '输入的库路径有错误') -or ($private:temp997 -eq '无返回') )
{
Write-Error "找不到 'u库_线程级别_任务表_多线程_读取所有正运行任务数420.ps1' "
}
else
{
$private:u库_定时任务_所有进程的线程数总和 = & $private:temp997 #进程,线程,并发数总和
}
if ($private:u库_定时任务_所有进程的线程数总和 -gt $global:u库_线程级别_定时任务_最大并发线程数_所有进程的线程数总和)
{
if ((Get-Date) -gt $private:u库_定时任务_所有进程的线程数总和_的写日志时间间隔)
{
$private:u库_定时任务_所有进程的线程数总和_的写日志时间间隔 = (Get-Date).AddMinutes(1)
& 'k_写log.ps1' -被写入的log内容 "错误:u库,线-程级别,定时任务进程,【$pid】,已运行任务数超出设定最大值。 $private:u库_定时任务_所有进程的线程数总和 "
}
Write-Error "错误:u库,线-程级别,定时任务进程,【$pid】,已运行任务数超出设定最大值。 $private:u库_定时任务_所有进程的线程数总和 "
continue
}
elseif ($private:已经fork进程 -gt 0)
{
#不再执行:判断是否已经fork进程,否则建立进程。
}
else
{
if ((Get-RSJob).count -gt $global:u库_线程级别_定时任务_最大并发线程数_单进程)
{
if ($private:已经fork进程 -gt 0)
{
}
else
{
#fork进程。
$private:文件流.Dispose()
& 'u库定时任务_线程级别_删pid文件.ps1'
if ( ($IsWindows -eq $True) -or ($PSVersionTable.psversion.major -lt 6) ) #win
{
Start-Process -WindowStyle "Hidden" -FilePath "$global:u库_线程级别任务_的ps版本" -ArgumentList " -file ${global:kasini3000目录}/u库定时任务_线程级别.ps1"
}
if ($IsLinux -eq $True)
{
$private:linux_process_args = " $global:u库_线程级别任务_的ps版本 -NonInteractive -NoProfile -file ${global:kasini3000目录}/u库定时任务_线程级别.ps1 "
Write-Verbose $private:linux_process_args
Start-Process -FilePath '/usr/bin/nohup' -ArgumentList $private:linux_process_args
}
$private:已经fork进程 = 2
& 'k_写log.ps1' -被写入的log内容 "信息:u库,线-程级别,定时任务进程,【$pid】超过单进程最大线程,已经fork新进程。"
Write-Error "信息:u库,线-程级别,定时任务进程,【$pid】超过单进程最大线程,已经fork新进程。"
$private:temp981 = Get-Random -InputObject @(3,4,5,8,9,0)
$private:temp982 = @($private:temp981,$($private:temp981 + 10),$($private:temp981 + 20),$($private:temp981 + 30),$($private:temp981 + 40),$($private:temp981 + 50))
$global:u库_线程级别_定时任务_循环在_秒 = $private:temp982
do
{
Start-Sleep -Seconds 1
$private:现在 = Get-Date
}
while ($private:现在.Second -notin $global:u库_线程级别_定时任务_循环在_秒)
continue
}
}
}
#endregion 检查是否超过并发数
# 超过结束时间,则不会新建任务,无任务则退出。
if ( ($private:结束时间2 -lt $private:现在) -or ($private:已经fork进程 -gt 1) )#$private:结束时间2应该小于51秒。
{
if ((Get-RSJob).count -le 0)
{
$private:文件流.Dispose()
& 'u库定时任务_线程级别_删pid文件.ps1'
& 'k_写log.ps1' -被写入的log内容 "信息:u库,线-程级别,定时任务进程,【$pid】正常结束。"
Write-Error "信息:u库,线-程级别,定时任务进程,【$pid】正常结束。"
$global:u库_线程级别_定时任务_循环中 = $false
}
else
{
$private:temp995 = "信息:u库,线-程级别,定时任务进程,【$pid】,现有任务线程【{0}】个" -f (Get-RSJob).count
& 'k_写log.ps1' -被写入的log内容 $private:temp995
& 'k_写log.ps1' -被写入的log内容 ( (Get-RSJob).State | Out-String )
Start-Sleep -Seconds 60
}
}
elseif ($private:已经fork进程 -gt 0)
{
#不再执行,新建线程级别任务计划。
#即使 (Get-RSJob).count 已经少于 $global:u库_线程级别_定时任务_最大并发线程数_单进程,也是这样。
}
else
{
if ($global:u库_线程级别_定时任务_启用 -eq $True)
{
$private:temp998 = & 'kdir-cmdb.ps1' -被查找的库文件名 'u库_线程级别_计划表_2_任务表.ps1'
if ( ($private:temp998 -eq '输入的库路径有错误') -and ($private:temp998 -eq '无返回') )
{
Write-Error "找不到 'u库_线程级别_计划表_2_任务表.ps1' "
}
else
{
& $private:temp998
}
}
do
{
Start-Sleep -Seconds 1
$private:现在 = Get-Date
}
while ($private:现在.Second -notin $global:u库_线程级别_定时任务_循环在_秒)
if ($global:u库_线程级别_定时任务_启用 -eq $True)
{
& 'begin_invoke_u库_任务表_rs.ps1'
}
}
}
exit 0
PowerShell
1
https://gitee.com/chuanjiao10/kasini3000.git
git@gitee.com:chuanjiao10/kasini3000.git
chuanjiao10
kasini3000
kasini3000
master

搜索帮助