【PowerShell】クラッシュ・誤って終了したアプリやプロセスを自動的に再起動する方法
はじめに
この記事では、PowerShellを使って特定のアプリケーションやプロセスが実行中かどうかを確認する方法と、クラッシュした場合、ユーザーが誤って終了させた場合、あるいはメモリリークによって大量のメモリを消費し始めた場合に、自動的に再起動させる方法を解説します。
プロセスの起動確認と基本的な再起動スクリプト
以前の記事では、PowerShellによるWindowsプロセスの管理方法を紹介しました。例として、notepad.exeプロセスが実行されているかどうかを確認し、実行されていない場合に起動するスクリプトは以下の通りです。
If (!(Get-Process -Name notepad -ErrorAction SilentlyContinue))
{Invoke-Item C:\Windows\notepad.exe
}応答なし・メモリ過多のプロセスを自動再起動する
プロセスが応答しなくなった(ハングした)場合や、メモリ使用量が過剰になった場合(この例では約1000MB超)にも、自動的に再起動させることができます。
$proc = Get-Process -Name notepad | Sort-Object -Property ProcessName -Unique
If (($proc.Responding -eq $false) -or ($proc.WorkingSet -GT 1000000*1024)) {
$proc.Kill()
Start-Sleep -s 10
Invoke-Item C:\Windows\notepad.exe
}forループによる常時監視スクリプト
PowerShellの for ループを利用すれば、プロセスを起動し、60秒ごとに実行状態をチェックして、必要に応じて自動的に再起動する無限ループを作成できます。
for(;;){
try{
If (!(Get-Process -Name notepad -ErrorAction SilentlyContinue))
{Invoke-Item C:\Windows\notepad.exe}
$proc = Get-Process -Name notepad | Sort-Object -Property ProcessName -Unique -ErrorAction SilentlyContinue
If (!$proc -or ($proc.Responding -eq $false) -or ($proc.WorkingSet -GT 200000*1024)) {
$proc.Kill()
Start-Sleep -s 10
Invoke-Item C:\Windows\notepad.exe}
}
catch { }
Start-sleep -s 60
}リモートコンピュータ上のプロセスを監視する
リモートコンピュータ上のプロセス状態を確認したい場合は、以下のコマンドを使用します。
$proc = Get-Process -ComputerName WKS-NYC211 -Name notepad | Sort-Object -Property ProcessName -Unique -ErrorAction SilentlyContinueまた、リモートコンピュータ上でプロセスを起動するには、Invoke-Command コマンドレットを使用します。
Invoke-Command -ComputerName WKS-NYC211 -Credential $Cred -ScriptBlock {Start-Process C:\Windows\notepad.exe -wait -verb runas;}GPOログオンスクリプトとして実行する
このPowerShellスクリプトは、GPO(グループポリシー)のログオンスクリプトとして、ユーザーのログオン時に実行することができます。
その際は、PowerShellコードを拡張子 *.ps1 のファイルとして保存してください。スクリプトにデジタル署名を付与するか、PowerShellの実行ポリシー設定を変更するか、あるいは -ExecutionPolicy Bypass オプションを付けてスクリプトを実行します。
- ファイル名:
%windir%\System32\WindowsPowerShell\v1.0\powershell.exe - 実行オプション:
-windowstyle hidden -ExecutionPolicy Bypass -Noprofile -file %~dp0CheckProcess.ps1
タスクスケジューラで定期実行する
PS1スクリプトは、タスクスケジューラを使って定期的に実行することも可能です。実行オプションは上記と同じものを使用し、プロセスを実行するユーザーアカウントを指定することもできます。
$Action= New-ScheduledTaskAction -Execute "PowerShell.exe" -Argument "-windowstyle hidden -ExecutionPolicy Bypass -file %windir%\CheckProcess.ps1"
$Trigger= New-ScheduledTaskTrigger -AtLogon
$Principal=New-ScheduledTaskPrincipal -UserId "jsmith" -LogonType Interactive
$Task=New-ScheduledTask -Action $Action -Trigger $Trigger -Principal $Principal
Register-ScheduledTask -TaskName "Check Notepad Process" -InputObject $TaskWindowsサービスとして実行する
もう一つの選択肢として、このPowerShellスクリプトをWindowsサービスとして実行する方法があります。
監視対象のアプリケーションがユーザーとの対話を必要としない場合は、サービスとして実行する方が望ましいでしょう。そうすることで、後から標準の services.msc コンソールやPowerShellを使って簡単に管理できるようになります。Windowsにはサービスを自動的に再起動する組み込み機能があり、ハングアップしたサービスについても同様の手順で再起動できます。
-
PowerShellまたはWevtutilを使用してWindowsイベントログをクリアする方法
コンピューターやサーバー上のWindowsイベントログから、すべてのエントリを削除したいケースがあります。もちろん、イベントビューアーのGUI(Eventvwr.msc)からシステムログをクリアすることも可能です(対象のログを右クリックし、「ログのクリア」を選択)。しかし、Windows Vista以降、システムはさまざまなコンポーネントごとに数十種類ものログを使用しており、イベントビューアーから手作業ですべてをクリアするのは非常に手間がかかります。 そこで便利なのが、コマンドラインからの操作です。PowerShellまたは内蔵コンソールツールwevtutilを使えば、効率的にログをクリアでき
-
Androidアプリをプログラムで「再起動」する方法|AlarmManagerとPendingIntentの活用
Androidアプリをプログラムで「再起動」するには? 設定変更の反映や状態の初期化など、アプリケーション全体をプログラムから再起動したい場面は意外と多くあります。本記事では、AlarmManagerとPendingIntentを組み合わせて、Androidアプリ全体をコードから「再起動」する方法を、サンプルコード付きで段階的に解説します。 手順1:Android Studioで新規プロジェクトを作成する まず、Android Studioのメニューから「File」→「New Project」を選択し、必要な情報をすべて入力して新しいプロジェクトを作成してください。 手順2:activity_