2016-09-14 53 views
3

ユーザーがそこにいるのは、ユーザーがサーバーを介してSAP 9.2に接続するというものです。休眠中のSAPプロセスを強制終了するスクリプト

ユーザーがWeb上でSAP 9.2を実行すると、SAPクライアントアプリケーションを実行するときと同様に、SAPはサーバー上でexeプロセスを開始します。ユーザがSAP上で作業を終えると、通常、ユーザはファイルを選択せず​​に終了しますが、SAPが閉じられたと仮定してタブを閉じるだけです。

サーバー上で、SAP exeプロセスが閉じられていない、昨日私は1人のユーザーしかログインしていないのにサーバーメモリが満杯(100%の使用率)であったことに気付きました。 Web上のSAP 9.2がスムーズに実行された後、すべてのサービスを手動で終了する必要がありました。

今日は、添付のスクリーンショットに従って11以上のSAPプロセスに戻り、昨日から4人のユーザーしかログインしておらず、スクリーンショットを撮ったときに誰もログインしていませんでした。

enter image description here

私の質問はどのように私はTASKKILLの使用またはログインユーザーに影響SAP Business Oneのに属さず、すべての休止状態のプロセスを殺すために他の方法を作ることができ、ありますか?

ユーザーはWindows Server 2012標準版を使用しています。

答えて

2

あなたが(例えば、または)任意の特定のタグをあなたの質問にタグを付けていなかったし、私はあなたのバッチファイルをしたいと仮定したいです。 アルゴリズムは、使用する言語にかかわらず同じですが、明らかに構文がかなり異なります(PowerShellスクリプトははるかに簡単で短いです)。コマンドラインから

(そして最終的にスケジュールされたタスクまたは自動操作でユーザーがログイン中)あなたはTASKKILLを使用することができます。

TASKKILL /FI "IMAGENAME eq imagename.exe" /FI "USERNAME ne %USERNAME%" /T /F 

ほとんどのノート:

  • imagename.exeを交換してくださいSAP Business Oneプロセス(TASKLISTを使用してチェックしてください)の代わりに、WINDOWTITLEフィルタを使用することもできます。
  • ユーザーがドメインにログインしている場合は、%USERNAME%%USERDOMAIN%\%USERNAME%に置き換えてください。
  • /Fスイッチを強制的に閉じる指定のプロセスは、穏やかな終了が機能しない場合にのみ実行します。
  • /Tはプロセスとそのすべての子を閉じます(これらのプロセスのいくつかには子プロセスがあります)。
  • TASKKILLより多くのフィルタを確認します。このコマンドを実行している現在ログインしているユーザーに属していないすべてのプロセスが強制終了されることに注意してください。 1つの明白な意味があります。ログインしているユーザーには必要な権限があり、ログインしているユーザーは1人だけです。

最後の点の含意は何とか巨大であり、それを回避する必要がある場合、状況はさらに複雑になります。(のは、プロセスのイメージ名がsapbo.exeであることをこの例では想定してみましょう)あなたはTASKLIST /Vを使用して、詳細なプロセス情報を取得することができ、あなたが使って便利なフォーマットで出力をフォーマットすることができますことを考える:

何かを使用してを に解析することができます
TASKLIST /V /FO:CSV /FI "IMAGENAME eq sapbo.exe" 

FOR /F "delims=, tokens=1-7" %1 IN ('TASKLIST /V /FO:CSV "IMAGENAME eq sapbo.exe"') DO (
    echo %1 %7 
) 

ユーザーがログインしているかどうかを判断する必要があります。それは、対話型セッションの場合は、単にWindowsシェルのプロセスをチェックして(あなたがうまく物事をしたい場合は...レジストリからそれを読んで)私が知っている最も簡単な方法は、this postからのコードを使用することです:あなたが必要とするので

TASKLIST /FI "IMAGENAME eq myapp.exe" 2>NUL | FIND /I /N "myapp.exe">NUL 
IF "%ERRORLEVEL%"=="0" ECHO Programm is running 

をそれはログインしたユーザーが、その後DO部分の後にこれを入れていない場合は、プロセスを殺すために(これは私はわかりやすくするために分割し、ここで、1行です):

TASKLIST /FI "IMAGENAME eq winlogon.exe" /FI "USERNAME eq %7" 2>NUL 
    | FIND /I /N "winlogon.exe" > NUL 
    || TASKKILL /T /F /PID %2 

があなたの特定のケースにこのコードを適応することを忘れないでください ...


私がPowerShellで言ったように、はるかに簡単です。まず、あなたが殺さ対象のすべてのプロセスを取得したいすべての:それらを介して

Get-Process sapbo -IncludeUserName 

ループを、インタラクティブなセッションがあるかどうかを確認:

foreach ($eligibleProcess in Get-Process sapbo -IncludeUserName) 
{ 
    if (-not Get-Process winlogon -ErrorAction SilentlyContinue -IncludeUserName | where { $_.UserName -eq $eligibleProcess.UserName }) 
    { 
     $eligibleProcess.Kill(); 
    } 
} 

私はここにコードを書いたことに注意してください、それはですテストされていない、注意してください...

+0

Ok。両方の方法:バッチファイルとPowerShellは知っておくと良いです –

関連する問題