Dans un précédent message, nous avons vu comment relancer le service SPTimerV3 à distance pour une liste définie de serveurs.
Ce script fonctionne parfaitement, mais force le redémarrage du service NT, même si cela n’est pas du tout nécessaire. Le fait est que le cas particulier des Alertes bloquées réside dans le blocage d’un Job SharePoint qui ne va pas au bout de son travail et reste dans un statut intermédiaire.
Ainsi, cette première version redémarrait en force ce service NT sans aucun test de validité, ce qui n’est pas optimal. De ce fait, une nouvelle version beaucoup plus aboutie a été écrite afin de :
- Lister tous les Jobs SharePoint de la ferme en cours
- Faire un test du statut des job “Immediate Alerts” pour tous les serveurs SharePoint de la ferme
- Si sur une des machines de la ferme, un des Job “Immediate Alerts” est dans un statut différent de “Succeeded” depuis plus d’un jour
- Effectue un redémarrage du service NT “SPTimerV3”
- Envoie un mail via SMTP à l’administrateur pour ce redémarrage avec le nom de la machine
- Si sur une des machines de la ferme, un des Job “Immediate Alerts” est dans un statut différent de “Succeeded” depuis plus d’un jour
On peut donc ensuite retrouver les messages de redémarrage dans son Outlook comme sur cet exemple :
Avec le détail :
Ce qui permet donc par la suite d’intervenir si ce redémarrage est trop régulier sur la machine.
Cette tache peut-être ensuite planifiée sur chaque ferme SharePoint.
function Send-SMTP-Message([string]$fromAdress, [string]$toAdress, [string]$SmtpServerAddress, [string]$SubjectTextToSend, [string]$MessageTextToSend)
{
$from = New-Object System.Net.Mail.MailAddress $fromAdress
$to = New-Object System.Net.Mail.MailAddress $toAdress# Create Message
$message = new-object System.Net.Mail.MailMessage $from, $to
$message.Subject = $SubjectTextToSend
$message.Body = $MessageTextToSend# Set SMTP Server and create SMTP Client
$server = $SmtpServerAddress
$client = new-object system.net.mail.smtpclient $server
# Send the message
"Sending an e-mail message to {0} by using SMTP host {1} port {2}." -f $to.ToString(), $client.Host, $client.Port
$client.Send($message)
"Message to: {0}, from: {1} has beens successfully sent" -f $from, $to
}function Restart-Service-AllServer([string]$MyServiceName, [Array]$MyServers, [string]$fromAdress, [string]$toAdress, [string]$SmtpServerAddress)
{
foreach($myServer in $MyServers)
{
[string]$SubjectToSend = "Restart of the Service", $MyServiceName, "For the Server", $myServer
[string]$MessageToSend = $SubjectToSend.ToString(), "-", (Get-Date).ToString()
Write-Host $MessageToSend
Get-WmiObject -computer $myServer Win32_Service -Filter "Name='$MyServiceName'"| Restart-Service -Force
Send-SMTP-Message $fromAdress $toAdress $SmtpServerAddress $SubjectToSend $MessageToSend
}
}function Restart-JobService-SPFarm([string]$MyJobTimerName, [string]$MyServiceName, [string]$fromAdress, [string]$toAdress, [string]$SmtpServerAddress)
{
[Array] $ServersNeedtobeRestarted = @()[Void] [System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SharePoint")
$MyFarm = [Microsoft.SharePoint.Administration.SPfarm]::Local
[Microsoft.SharePoint.Administration.SPWebServiceCollection]$mywebServices = new-object Microsoft.SharePoint.Administration.SPWebServiceCollection($MyFarm)Write-Host " ------------------------------------------------------------ "
foreach ($mywebService in $mywebServices)
{
$MyWebApplications = $mywebService.WebApplications;
foreach ($myWebApp in $MyWebApplications)
{
if($myWebApp.RunningJobs.Count -gt 0)
{
Write-Host " - Name:", $mywebService.Name, "- WEb Application Name:", $myWebApp.Name
$MyWebAppRunningJobs = $myWebApp.RunningJobs|Where{$_.JobDefinitionTitle -eq $MyJobTimerName}
foreach($myRunningjob in $MyWebAppRunningJobs )
{
Write-Host " - JobDef Title:", $myRunningjob.JobDefinitionTitle, "- ServerName:", $myRunningjob.ServerName, "- Status:", $myRunningjob.Status , "- PercentDone:", $myRunningjob.PercentageDone.ToString(), "- StartTime:", $myRunningjob.StartTime.ToString()
$DiffDate = ((Get-Date) - $myRunningjob.StartTime).Days
if(($DiffDate -gt 0) -and ($myRunningjob.Status -ne "Succeeded"))
{
Write-Host " ==>>>> Job need to be restarted - DiffDate:", $DiffDate, "days - Server", $myRunningjob.ServerName
$ServersNeedtobeRestarted += $myRunningjob.ServerName
}
}
}
}
}
Write-Host " ------------------------------------------------------------ "$ServersNeedtobeRestarted = $ServersNeedtobeRestarted |Select-Object -Unique
Write-Host "Server: ", $ServersNeedtobeRestarted
if($ServersNeedtobeRestarted.length -gt 0)
{
Write-Host " ==>>>> Restart the service ", $MyServiceName, "on the servers:", $ServersNeedtobeRestarted
Restart-Service-AllServer $MyServiceName $ServersNeedtobeRestarted $fromAdress $toAdress $SmtpServerAddress
}
}cls
$EmailFrom = "MOSSIntranet@mycompany.com"
$Manageremail = "SharePointManager@mycompany.com"
$smtpServer = "smtp-Server-Address.mycompany.com"$MyServiceNameToCheck = "SPTimerV3"
$myJobTimerNameToCheck = "Immediate Alerts"
Restart-JobService-SPFarm $myJobTimerNameToCheck $MyServiceNameToCheck $EmailFrom $Manageremail $smtpServer
Vous pouvez retrouver comme toujours ce script sur le site CodePlex créé pour ce type d’outils :
Romelard Fabrice [MVP]
Commentaires
Enregistrer un commentaire