Wishlist 0 ¥0.00

介紹好用工具:優異的 nssm 服務管理員 (Non-Sucking Service Manager)

我現在安裝 Windows 服務都使用功能完整的 nssm 來管理,他除了有 CLI 命令列工具介面外,也同時有支援 GUI 圖形化介面,所以非常容易上手。今天這篇文章我打算來分享幾個常見的用法。

以下命令皆使用 Command Prompt (命令提示字元) (cmd.exe) 來執行。

關於 nssm 服務管理員

Windows 內建的各種註冊 Windows 服務的工具都非常難用(sc.exe),不然就是功能太過陽春(New-Service),而且這些工具沒辦法幫你處理一些程式出錯的狀況,所有例外你都要在自己的程式處理,簡單來說,就是 (Sucks)! ?

所以 nssm 出現了,這個名字非常諷刺,這四個字就是 Non-Sucking Service Manager 的意思! ?

nssm 會額外幫你監控服務執行的狀況,如果發生「異常例外」導致程式掛掉,程式自動重啟。即便程式寫成異常發生但「正常結束」,最後 Windows 服務管理員還是會幫你自動重啟。

使用 nssm 安裝並啟動 Windows 服務

  1. 安裝 nssm 工具

    常看我文章的朋友應該都知道,我都是用 Chocolatey 來安裝軟體:

    choco install nssm -y
    

    事實上 nssm 是免安裝的綠色軟體,而且只有 nssm.exe 單一執行就可以運行。只要從 官網下載 壓縮檔回來,將 nssm.exe 解壓縮到 C:\Windows 底下就直接可以用了!

    注意: 使用 nssm 註冊服務時,它會自動在你的 事件記錄器 中註冊一個 名為 NSSM 的 事件來源 (Event Source)。

  2. 使用 GUI 介面安裝 Windows 服務

    請以系統管理員身份執行 Command Prompt (cmd.exe),並使用以下命令執行安裝:

    nssm install MyService
    

    這個命令事實上會自動開啟 nssm 的 GUI 圖形化介面,非常容易上手好操作:

    nssm 的 GUI 圖形化介面

    設定好之後,按下 Install service 就會自動安裝成功!?

    如果要移除 Windows 服務,也可以這樣執行,也一樣會跳出 GUI 介面:

    nssm remove MyService
    
  3. 使用 CLI 介面安裝 Windows 服務

    以下就是一個最簡單的「免互動」安裝 Windows 服務命令:

    nssm install MyService "C:\EC.Services\訂單處理服務.exe"
    

    他會自動幫你設定應用程式路徑(Application)、工作目錄(AppDirectory)等參數,如果你的程式可以這樣執行,不需要其他應用程式殼層(AppShell),例如 dotnet.exe 或 java.exe 等等。那麼,這確實是最簡單的建立服務方法。

    以下是「免互動」重新啟動 Windows 服務命令:

    nssm stop MyService
    nssm start MyService
    nssm restart MyService
    

    以下是「免互動」移除安裝 Windows 服務命令:

    nssm remove MyService confirm
    
  4. 使用 CLI 介面安裝需要有 應用程式殼層 (AppShell) 才能啟動的 Windows 服務

    這邊我說的是像 dotnet.exe 或 java.exe 這種類型的應用程式,.NET Core 就需要 dotnet.exe MyService.dll 來啟動,而 Java 的 *.jar 就需要執行 java.exe -jar MyService.jar 才能啟動這種。

    這種類型的應用程式,第一次透過 nssm 註冊服務的人,會很容易忘記設定 AppDirectory (工作目錄) 參數,導致應用程式很容易會啟動失敗!

    以下就是一個完整的範例,從安裝服務、設定參數到自動啟動,一口氣設定到好:

    解释

    nssm install MyService "C:\Program Files\Zulu\zulu-8\bin\java.exe" nssm set MyService AppDirectory "C:\Projects\MyService\target" nssm set MyService AppParameters "-jar MyService-0.0.1-SNAPSHOT.jar --server.port=8080" nssm set MyService AppStdout "C:\Projects\MyService\target\MyService-0.0.1-SNAPSHOT.log" nssm start MyService

認識 nssm 的服務執行參數

nssm 提供非常大量的參數可供設定,我也趁著這篇文章全部閱讀過一遍,這才發現 nssm 真的非常強大,果然是我心目中的王者!

以下我列出所有的服務執行參數,這些參數都可以對應到 nssm 的 GUI 圖形化介面上的頁籤,我會額外加上註解說明用途與預設值,詳細說明請見 NSSM Usage 文件!

你可以透過以下命令查詢 nssm 實際註冊到 Windows 服務之後的 nssm 服務執行參數為何。

  • Application

    解释

    REM 應用程式路徑 REM 預設: 應用程式完整路徑 (C:\EC.Services\訂單處理服務.exe) nssm get MyService Application REM 工作目錄 REM 預設: 應用程式所在目錄路徑 (C:\EC.Services) nssm get MyService AppDirectory REM 應用程式參數 REM 預設: 無內容 nssm get MyService AppParameters
  • Details

    解释

    REM 服務的顯示名稱 (顯示名稱可以跟服務名稱不同) REM 預設: 服務名稱 (MyService) nssm get MyService DisplayName REM 服務詳細描述 REM 預設: 無內容 nssm get MyService Description REM 服務啟動方式 REM 預設: SERVICE_AUTO_START (自動啟動) nssm get MyService Start
  • Log on

    解释

    REM 服務啟動方式 REM 預設: LocalSystem (本機系統) nssm get MyService ObjectName REM 服務啟動方式 REM 預設: SERVICE_WIN32_OWN_PROCESS nssm get MyService Type
  • Dependencies

    REM 相依服務
    REM 預設: 無內容
    nssm get MyService DependOnService
    
  • Process

    解释

    REM 執行優先權 REM 預設: 無內容 nssm get MyService AppPriority REM 是否不要啟動一個隱藏的 Console 視窗來執行服務 (有些程式沒有 STDIN 輸入會掛掉) REM 預設: 0 (要啟動一個隱藏的 Console 視窗來接受 STDIN 輸入) nssm get MyService AppNoConsole REM 要用多少 CPU 核心執行 (CPU Affinity) REM 預設: All (所有 CPU 核心) nssm get MyService AppAffinity
  • Shutdown

    解释

    REM 判斷要用什麼方式傳遞訊號給應用程式 REM 預設: 0 (代表什麼訊號都傳給應用程式) nssm get MyService AppStopMethodSkip REM 當送出 Control-C 的時候要等待幾豪秒進行優雅結束 (Gracefully Shutdown) REM 預設: 1500 豪秒 nssm get MyService AppStopMethodConsole REM 當送出 WM_CLOSE 訊號的時候要等待幾豪秒進行優雅結束 (Gracefully Shutdown) REM 預設: 1500 豪秒 nssm get MyService AppStopMethodWindow REM 當送出 WM_QUIT 訊號的時候要等待幾豪秒進行優雅結束 (Gracefully Shutdown) REM 預設: 1500 豪秒 nssm get MyService AppStopMethodThreads
  • Exit actions

    解释

    REM 如果程式在幾豪秒之內就死掉就延遲啟動 REM 預設: 1500 豪秒 nssm get MyService AppThrottle REM 應用程式結束時的預設行為 REM 預設: Restart (重啟服務) nssm get MyService AppExit Default REM 服務重啟的延遲啟動豪秒數 REM 預設: 0 豪秒 nssm get MyService AppRestartDelay
  • I/O

    解释

    REM 應用程式的 STDOUT 訊息要輸出到哪個檔案 REM 預設: 無內容 nssm get MyService AppStdout REM 應用程式的 STDERR 訊息要輸出到哪個檔案 REM 預設: 無內容 nssm get MyService AppStderr
  • File rotation

    解释

    REM 設定是否要對記錄檔進行自動 Rotate 處理 REM 預設: 1 nssm get MyService AppRotateFiles REM STDOUT 訊息紀錄檔的建立方式 REM 預設: 4 (開啟現有的紀錄檔進行寫入) nssm get MyService AppStdoutCreationDisposition REM STDERR 訊息紀錄檔的建立方式 REM 預設: 4 (開啟現有的紀錄檔進行寫入) nssm get MyService AppStderrCreationDisposition REM 服務在執行的時候也可以 Rotate 記錄檔 REM 預設: 0 (預設要停用服務才會 Rotate 記錄檔) nssm get MyService AppRotateOnline REM 當記錄檔已經超過幾豪秒就自動 Rotate REM 預設: 86400 nssm get MyService AppRotateSeconds REM 當記錄檔已經超過多少 Bytes 就自動 Rotate REM 預設: 1048576 nssm get MyService AppRotateBytes
  • Environment

    REM 服務啟動前先設定好環境變數
    REM 預設: 無內容
    nssm get MyService AppEnvironmentExtra
    

注意「雙引號」傳遞應用程式參數可能造成的問題

在 Command Prompt 命令提示字元中,一直以來最被詬病的問題,就是「雙引號」的跳脫處理會讓整個命令變的可讀性極差,所以當你需要傳遞參數到服務應用程式時,需要傳入執行的參數包含「雙引號」,那就有地方要特別注意了!

假設你的應用程式參數必須包含空白字元,所以需要使用雙引號框起來:

  1. 手動執行的寫法

    "C:\EC.Services\訂單處理服務.exe" "This is one argument"
    
  2. 使用 nssm 的安裝命令

    nssm install "訂單處理服務" "C:\EC.Services\訂單處理服務.exe" """This is one argument"""
    

假設你要執行 Java 應用程式,參數可能很複雜,例如:

  1. 手動執行的寫法

    REM 設定 JavaExe 變數不需要加上雙引號
    JavaExe=C:\Program Files\Zulu\zulu-8\bin\java.exe
    
    "%JavaExe%" -Dsolr.solr.home="%CD%\solr" -Djetty.home="%CD%" -Djetty.logs="%CD%\logs" -cp "%CD%\lib\*.jar";"%CD%\start.jar" -jar "%CD%\start.jar"
    

    使用 %CD% 可以取得當前目錄的路徑!

  2. 使用 nssm 的安裝命令

    REM 設定 JavaExe 變數不需要加上雙引號
    JavaExe=C:\Program Files\Zulu\zulu-8\bin\java.exe
    
    nssm install solr "%JavaExe%" -Dsolr.solr.home="\"%CD%\solr"\" -Djetty.home="\"%CD%"\" -Djetty.logs="\"%CD%\logs"\" -cp "\"%CD%\lib\*.jar"\";"\"%CD%\start.jar"\" -jar "\"%CD%\start.jar"\"
    

    你看看,這段批次檔多醜啊! ?

注意設定環境變數的寫法

在服務啟動之前設定好環境變數,這應該是我最愛 nssm 的功能之一了!

架設我希望在執行 MyService 服務之前,先給定三個環境變數,分別是 A=1B=2C=3 等等,那麼你應該在建立好服務且尚未啟動服務之前,先這樣設定好環境變數:

nssm set MyService AppEnvironmentExtra "A=1" "B=2" "C=3"

Antimalware Service Executable 是什么?它占用 CPU 过高怎么办?

Antimalware Service Executable 是什么?它占用 CPU 过高怎么办?

原文: What is Antimalware Service Executable? Why is it High CPU Disk Usage?

反恶意软件服务 Antimalware service executable 是在后台运行的 Windows 安全组件。

但有时,Antimalware Service Executable 可能会因占用过多 CPU 而对 Windows 10 计算机产生负面影响。

在本指南中,我将向你展示什么是 Antimalware Service Executable、为什么它占用这么多 CPU,以及如何优化你的 Windows 10 计算机以确保它不会占用太多 CPU。

Antimalware Service Executable 是什么

Antimalware Service Executable 是一个 Windows 安全进程,它执行针对恶意软件的实时保护。

Antimalware Service Executable 也被称为 msmpeng.exe,在后台运行,因此它可以不时地检测文件和程序。

当它检测到病毒或其他恶意攻击时,它会删除或隔离它们。

为什么 Antimalware Service Executable 占用大量 CPU

在后台运行时,它会主动扫描程序和文件,并在检测到任何恶意攻击时执行适当的操作。

此外,Antimalware Service Executable 占用过多 CPU,因为它会扫描自己的文件夹——C:\Program Files\Windows Defender

因此,阻止 Antimalware Service Executable 扫描其自己的文件夹是使其占用更少 CPU 的方法之一。

如何阻止 Antimalware Service Executable 占用过多的 CPU

阻止 Antimalware Service Executable 占用过多 CPU 的两种主要方法是重新安排 Windows 安全扫描并阻止它扫描自己的文件夹。

重新安排扫描不会使扫描一直发生,并且阻止它扫描自己的文件夹将禁用实时保护。

解决方案 1:阻止 Antimalware Service Executable 扫描自己的文件夹

第 1 步:按键盘上的 WIN 键并选择齿轮图标以打开“设置”。

opensettings

第 2 步:从菜单图块中单击“更新和安全”。

ss-2-3

第 3 步:选择 “Windows 安全”,然后点击“病毒和威胁防护”。

ss-3-2

第 4 步:Windows 安全应用程序将打开。在“病毒和威胁防护设置”下,单击“管理设置”链接。

ss-4-2

第 5 步:向下滚动到“排除项”,然后选择“添加或删除排除项”链接。

ss-5-2

第 6 步:在下一页上,单击“添加排除项”,然后选择“文件夹”。

ss-6

第 7 步:将 C:\Program Files\Windows Defender 粘贴到编辑器中,然后单击“选择文件夹”。

ss-7

第 8 步:单击“选择文件夹”后,在弹出框中点击“是”。

所选文件夹现在将被添加到排除项中并且不会被扫描。

ss-8

解决方案 2:禁用实时保护并重新安排扫描

第 1 步:按 WIN(Windows 键)打开运行对话框。

第 2 步:键入 “taskschd.msc”,然后单击“确定”,这将打开任务计划程序(Task Scheduler)。

ss-9

第 3 步:展开“任务计划程序选项卡”、“Microsoft” 和 “Windows”。

ss-10

第 4 步:向下滚动并选择 “Windows Defender”。

ss-11

第 5 步:右键单击 “Windows Defender 计划扫描”并选择“属性”。

ss-12

第 6 步:取消选中“以最高权限运行”。

ss-13

第 7 步:转到“条件”选项卡并取消选中那里的所有内容。

ss-14

第 8 步:切换到触发器选项卡,然后单击“新建”。

ss-15

第 9 步:安排你希望 Windows Defender 运行扫描的时间,选择频率、日期和时间,然后单击“确定”。再次单击“确定”。

ss-16

第 10 步:重新启动计算机。这样,Antimalware Service Executable 就不会再占用太多 CPU 了。

总结

不可否认,Antimalware Service Executable 可以防止恶意软件攻击,因此你可以在使用 Windows 10 计算机时更加安全。

如果你尝试使用本文介绍的两种方法使 Antimalware Service Executable 消耗更少的 CPU,则可以优化你的计算机设置。

感谢你阅读本文。

服务器大量php-cgi.exe进程,导致CPU占用100%的解决

出现该问题一般为程序方面问题,如程序采用fastcgi方式运行PHP,而程序设置的StartProcesses又偏大,如6甚至更大。

解决参考:

1.检查系统盘空间。查看系统临时文件是否过多,MySQL数据库的临时文件默认存到了c:/windows/temp,导致累积了几万甚至上百万的小文件,压垮系统盘。


2.PHP是一种广泛使用的动态脚本语言,不过在IIS中并没有内置对PHP语言的支持,因此如果需要使用PHP,必须自行安装。PHP可以安装为CGI模式或者ISAPI模式,由于ISAPI模式具有更高的性能,因此我建议大家使用ISAPI模式。
3.如能修改程序,建议将程序配置文件中的StartProcesses值缩到2,看是否改善。
4.看是否服务器有问题攻击现象。
windows 2003+IIS6中优化fastcgi配置文件fcgiext.ini,减少 PHP-cgi.exe进程数量和所占内存大小
本来听说fastcgi比isapi好就在服务器中装上了,配置环境为windows 2003+IIS6+fastcgi(FCGI)+PHP5.2.17,经过与很长一段时间观察,发现工作在FastCGI模式下的PHP会占用越来越多的内存,访问量稍微多点php-cgi进程就多了N个,同样情况下能比原来用isapi模式的时候多出几百M,我的服务器内存只有2G伤不起啊。
我在网上搜索了一下,发现还有不少人面临同样的问题。来自PHP官方的一个比较正式的解释是:php-cgi进程并没有内存泄漏,php-cgi会在每个请求结束的时候回收脚本使用的全部内存,但是并不会释放给 操作系统,而是继续持有以应对下一次PHP请求。这样做大概是为了减少内存碎片化或者解决从系统申请内存之后又释放回操作系统所需要的时间不可控问题。可是如果偶然一次PHP请求使用了诸如ftp或者zlib这样的大内存操作,那么将导致一大块系统内存被php-cgi持续占有,不能被利用。
解决这个问题的办法是在web服务器配置中优化fastcgi配置文件参数。
在C:\WINDOWS\system32\inetsrv\fcgiext.ini 文件中可以设定php-cgi进程相关参数,如:
[Types] php = PHP
[PHP] ExePath=C:\php-5.3.8-nts-Win32-VC9-x86\php-cgi.exe
maxInstances=100
InstanceMaxRequests=10000
EnvironmentVars=PHP_FCGI_MAX_REQUESTS:10000
RequestTimeout=600
ActivityTimeout=900
在上面的配置中:
ExePath  指定了FastCGI解析程序的路径,
instanceMaxRequests  指定了每个实例可以处理的最大请求数,
maxInstances 指定可以启动的最大实例数目,
EnvironmentVars 创建了一个环境变量 PHP_FCGI_MAX_REQUESTS ,默认值设为10000,
requestTimeout  指定了请求的超时时间为600秒,
activityTimeout  指定了活动会话超时时间为900秒。
一下是建议值:
maxInstances=
把这个值改小
建议
512M 内存的改maxInstances=50
1G 内存的改maxInstances=80
2G 内存的改maxInstances=140
再修改
InstanceMaxRequests=
把这个值改小
建议
512M 内存的改InstanceMaxRequests=200
1G 内存的改InstanceMaxRequests=300
2G 内存的改InstanceMaxRequests=500


改完, 重启IIS。
 
instanceMaxRequests  PHP_FCGI_MAX_REQUESTS  这两个参数决定了一个php-cgi进程被创建出来之后,最多接受的PHP请求数,在lighttpd中默认配置是10000。也就是说这个php-cgi进程每接受10000次PHP请求后会终止,释放所有内存,并重新被管理进程启动。如果把它降低,比如改成100,那么php-cgi重启的周期会大大缩短,偶然的高内存操作造成的问题影响时间也会缩短。
maxInstances 这个参数指定可以启动的最大实例数目,即php-cgi.exe进程的数目。如果把它降低,比如改成100,那么在任务管理器的进程中最多只有php-cgi.exe进程,php-cgi.exe所占用的总内存将大大减少。
我现在用的服务器为windows 2003操作系统,4G内存,一个php-cgi.exe程序占用7-25M内存,我把maxInstances值调为300,减少了php-cgi.exe进程的总数量,占用内存也减小了,反应速度比以前快了不少,至少调整到多少,可根据您的站点访问量来决定。

Antimalware Service Executable 高内存的处理办法,亲测有效

反恶意软件服务的可执行过程中扮演的重要角色的Windows Defender与Windows捆绑10服务(和,尽管相似性的名字,是完全无关的Emsisoft反恶意软件!)。但是,它消耗的内存远远超过其应有的CPU处理能力,这也是臭名昭著的,甚至可以单枪匹马地降低计算机的速度,以至于无法应付。

如果您是Windows Defender用户,并且在异常长时间内注意到CPU使用率很高,您将很高兴知道此问题可以轻松解决。

在本文中,我们汇总了一些简单的步骤,您可以按照这些简单的步骤来防止Antimalware Service Executable占用系统资源并保持计算机平稳运行。

立即

什么是msmpeng.exe反恶意软件服务可执行文件?

您是否使用Windows Defender保护您的计算机?如果是这样,请打开Windows任务管理器(Ctrl + Shift + Esc或“开始”菜单>任务管理器),滚动浏览后台进程列表,您将找到一个名为Antimalware Service Executable的进程及其相应的文件msmpeng.exe。

通过此过程,Windows Defender可以连续监视计算机中是否存在潜在威胁,并提供实时保护,以防止恶意软件和网络攻击。但是,与此同时,这也可能是CPU使用率过高的原因。

可能导致系统速度降低的另一个Windows Defender功能是其“ 完全扫描”功能,该功能可以对计算机上的所有文件进行全面检查。完全扫描严重依赖于CPU,因此不怕使用系统可用的任何资源。结果,当它运行时,您可能会遇到延迟,延迟,挂起和其他系统中断的情况。

虽然防病毒程序在运行扫描时会消耗系统资源是正常的,但Windows Defender的贪婪性远胜于大多数。众所周知,长时间使用过多的CPU会在唤醒计算机时进行扫描,以快速发送电子邮件或检查网站。

尽管这可能令人沮丧,但重要的是您必须先安装另一个IT安全解决方案才能禁用Windows Defender –毕竟,这可能是计算机和坏人之间唯一的事情!让程序执行其工作,解决所有威胁,然后按照以下步骤防止问题再次发生:

修复#1:更改Windows Defender的计划选项

对于大多数人来说,当Windows Defender运行完整扫描时,通常会发生由Antimalware Service Executable引起的高内存使用率。我们可以通过安排在您不太可能感到CPU耗尽的时间进行扫描来解决此问题。

Windows任务计划程序

优化完整扫描计划。

  1. 打开“开始”菜单键入“任务计划程序”,然后单击最上面的结果以启动程序。
  2. 在左侧的导航窗格中,双击“任务计划程序库”。继续展开这些文件夹并导航到以下目标:Library / Microsoft / Windows / Windows Defender
  3. 打开Windows Defender文件夹后,双击位于中间窗格中的Windows Defender Scheduled Scan
  4. 单击“条件”选项卡取消选中所有选项 ,然后单击“确定”。这将清除您的计划扫描。
  5. 为了保护您的计算机,安排一些新的扫描很重要,但是我们可以通过这种方式来减少对系统性能的影响。为此,请双击 Windows Defender预定扫描选择“触发器”选项卡然后单击“新建”
  6. 创建适合您需求的新扫描计划,选择在保护和系统效率之间取得平衡的选项。作为指导原则,我们建议(至少)每周扫描一次,这样您不太可能会注意到CPU使用率增加。
  7. Library / Microsoft / Windows / Windows Defender文件夹中找到的其余三个服务(Windows Defender缓存维护,Windows Defender清理,Windows Defender验证)重复该过程

修复#2:将可执行的反恶意软件服务添加到Windows Defender的排除列表中

在扫描过程中,Windows Defender会检查计算机上的每个文件-包括文件本身。这有时可能会导致一些有趣的交互,并且是系统滞后的常见原因。为防止这种情况发生,您可以简单地指示Windows Defender在执行系统扫描时跳过自身。

Windows Defender排除

About Us

Since 1996, our company has been focusing on domain name registration, web hosting, server hosting, website construction, e-commerce and other Internet services, and constantly practicing the concept of "providing enterprise-level solutions and providing personalized service support". As a Dell Authorized Solution Provider, we also provide hardware product solutions associated with the company's services.
 

Contact Us

Address: No. 2, Jingwu Road, Zhengzhou City, Henan Province

Phone: 0086-371-63520088 

QQ:76257322

Website: 800188.com

E-mail: This email address is being protected from spambots. You need JavaScript enabled to view it.