☰
惊现DaaS WebJob?它是Azure App Service平台自带的诊断服务
2026/10/15 6:33:24 网站建设 项目流程

你是不是也遇到过这种怪事:打开 Azure 门户的 WebJobs 列表,发现里面躺着一个名叫“DaaS”的 WebJob,而你自己清清楚楚地记得,从来没部署过什么 DaaS。第一反应多半是:是不是被谁塞了个后门?别急,我在很多个 App Service 环境里都见过它,而且今天就来把这个“幽灵 WebJob”彻底聊透——它到底是什么、为什么会出现、该怎么验证,以及到底要不要管它。这篇文章适合所有使用 Azure App Service 部署 WebJob 的同学,尤其是第一次在门户里看到 DaaS 时有点慌的人。看完之后,你会明白它其实是平台自带的一个诊断服务,不是你被黑的证据。

1. 先搞清楚 DaaS 这个 WebJob 到底从哪来的

1.1 DaaS 是平台内置的“体检医生”,不是你自己写的作业

DaaS 的全称是 Diagnostics as a Service,翻译过来就是“作为服务的诊断组件”。它不是你的定时任务,也不是业务代码,而是 App Service 平台用来做底层监控和问题诊断的一套扩展。

打个比方:你租了一间办公室,物业在配电房里装了一个巡检仪,用来检测线路、烟雾和漏水。你平时根本注意不到它,但某天物业贴了一张公告,说你办公室的电表附近多了一台设备,其实那是物业的巡检仪,不是隔壁邻居偷偷塞进来的。DaaS 就是这套巡检仪。

它的日常工作包括:

  • 采集进程崩溃时的 dump 文件,方便事后分析为什么进程挂掉
  • 监控 CPU、内存、句柄数这类运行时指标,遇到异常时留下线索
  • 配合门户里的“诊断并解决问题”页面,把诊断结果可视化展示
  • 在某些场景下,协助远程调试、性能分析、日志拉取

所以它是平台的一部分,不是你的业务代码。它的出现和你的部署操作没有直接关系,而是平台在幕后为了让你能更舒服地排查问题,自己加上去的“探头”。

1.2 DaaS 和你自己的 WebJob 不是一回事

很多同学之所以慌,是因为把 DaaS 当成了“别人恶意部署的 WebJob”。但实际上,它和你写的 WebJob 在来源、职责、管理方式上都完全不同。我整理了一个对照表,一看就明白:

对比项你自己部署的 WebJobDaaS
部署方开发者本人或 CI/CD 流水线App Service 平台自动安装
主要职责跑业务逻辑,比如消息队列消费、定时报表、数据清洗采集诊断数据,定位崩溃和性能问题
存放位置App_Data\jobs\{continuous|triggered}\你的Job名App_Data\jobs\continuous\DaaS
是否可见门户正常显示门户通常显示,但部分入口会隐藏
能不能随便删删了不影响平台,重新部署即可删了可能影响诊断功能,且可能被平台重建
是否计费跟着应用服务资源计费,没有额外费用跟着应用服务资源计费,没有额外费用

这个表看起来简单,但实际排查的时候非常关键。你只需要确认一件事:这个 DaaS 是否真的来自平台,而不是一个“伪装成 DaaS 的恶意程序”。后面的第三部分会专门教你怎么验证。

2. 平台是怎么把 DaaS“伪装”成一个 WebJob 的

2.1 WebJob 的识别机制其实就是一个目录约定

要理解 DaaS 为什么会出现在 WebJob 列表里,得先清楚 WebJob 的本质。

在 App Service 里,WebJob 的部署目录是有固定约定的:所有作业都必须放在wwwroot\App_Data\jobs下面,然后按运行方式分两类:

App_Data └── jobs ├── continuous # 连续运行型 WebJob │ ├── job-a │ └── job-b └── triggered # 触发型 WebJob ├── job-c └── job-d

平台的文件扫描器和门户后台,会去扫描这个目录。只要目录下有一个子目录,并且子目录里放了可执行文件或脚本,系统就会把它注册成一个 WebJob,然后在门户的 WebJobs 列表里显示出来。

所以,门户里“多出一个 WebJob”这件事,本质上就是“多了一个符合约定的目录”。目录是谁放进去的,决定了这个 WebJob 是人还是鬼。

2.2 DaaS 是怎么“混进去”的

DaaS 作为平台诊断服务的一部分,安装时其实也遵守了 WebJob 的目录约定。它会在App_Data\jobs\continuous\DaaS下面放一套启动脚本和程序集,通常是run.cmd,脚本内容一般是调用平台扩展目录里的诊断宿主程序。

这个动作不是恶意绕道,而是平台为了复用现有机制做的设计。因为 App Service 的资源管理器、进程管理、日志收集都对 WebJobs 这套机制非常熟悉,DaaS 注册成 WebJob 后,就能直接借助现成的作业生命周期管理来运行自己:进程被回收了会自动拉起、CPU 异常会被记录、日志会滚动到你熟悉的 LogFiles 目录里。

换句话说,DaaS 不是“伪装”成 WebJob,而是主动穿了 WebJob 的“制服”,方便自己混入运维体系。如果它不走这套机制,反而会需要另外一套进程管理和监控逻辑,工程成本高出不少。

2.3 触发它出现的常见场景

见过 DaaS 的同学,触发场景并不完全相同。常见的有这么几类:

场景为什么会看到 DaaS
新创建 App Service创建后平台后台自动安装诊断扩展,DaaS 随之注册
开启 Always OnAlways On 会保证连续 WebJob 持续运行,DaaS 作为连续作业更容易被注意到
使用门户的“诊断并解决问题”点击诊断工具时会临时唤醒 DaaS
从备份或 ARM 模板迁移/还原迁移过程中扩展被一并还原,DaaS 重新注册
平台自动修复/平台更新平台在后台维护时,偶发重新部署诊断扩展

有些环境里,DaaS 还会在“扩展”管理页面显示。老实说,平台对 DaaS 的展示并不同意,甚至有些 Azure 门户界面会故意把它隐藏掉,但你通过 Kudu 或 API 仍能看到它。这也是为什么很多人第一次发现它时总觉得是“灵异事件”——明明门户隐藏入口,却在某个列表里露头。

3. 三步验证这个 DaaS 不是被人偷偷塞进来的

看到这儿,你应该已经接受“DaaS 是平台组件”这个结论了。但毕竟环境不同,安全无小事。万一你所在公司的 App Service 被入侵,攻击者伪装一个 DaaS 也不是不可能。下面三步验证,能让你快速判断这个 DaaS 是正牌货还是冒牌货。

3.1 第一步:用 Kudu 看一下它的老巢

Kudu 是 App Service 的“后台管理面板”,地址一般是:

https://你的应用名.scm.azurewebsites.net

打开后选择 Debug Console → CMD,然后进到 DaaS 的目录看一眼:

cd D:\home\site\wwwroot\App_Data\jobs\continuous\DaaS dir /s type run.cmd

正常情况你看到的结构大致是:

run.cmd DaaS.dll DaaS.Core.dll Settings.json ...

run.cmd 的内容一般指向平台扩展目录里的宿主程序,而不是什么莫名其妙的 PowerShell 下载脚本或加密可执行文件。这一步看的是“它住在哪、吃什么”。

3.2 第二步:查扩展来源和文件签名

Kudu 还提供了一个接口,可以直接查询这个应用安装了哪些站点扩展:

curl -u 登录账号 https://你的应用名.scm.azurewebsites.net/api/siteextensions

或者直接用浏览器打开上面的 URL,会返回一个 JSON 列表。如果里面有 DaaS 或与诊断相关的扩展,说明它是通过正规扩展机制安装的,不是被人直接丢目录里的。

如果觉得还不够,再给文件签名做个体检。在 Kudu 的 PowerShell 窗口里执行:

Get-AuthenticodeSignature "D:\home\site\wwwroot\App_Data\jobs\continuous\DaaS\DaaS.dll"

正常文件会显示一个可信签名者,状态不是 NotSigned。如果是冒牌 WebJob,大概率没有可信签名,或者创建时间与你的应用创建时间对不上。另一个细节:看看目录的创建时间,是否和你开启诊断功能、创建站点的日期吻合。正版 DaaS 的目录时间基本能和平台操作时间对应上。

3.3 第三步:看它到底在干什么

验证一个进程是不是“坏东西”,最直接的办法就是看它实际行为。

在 Kudu 顶部的 Process Explorer 里,找到和 DaaS 相关的进程。正常情况它应该是一个诊断宿主进程,CPU 占用一般不高,内存也控制在几十到一两百 MB 以内。如果你发现它疯狂读写文件、高频外联、CPU 跑满,那就值得警惕了。

再看日志。App Service 的日志目录通常在:

D:\home\LogFiles

里面有 DaaS 或诊断相关的子目录,记录的是采集诊断数据的过程。如果日志内容都是“进程崩溃”“内存阈值触发”“作业启动”这类,基本可以判定是平台组件在干活。

走完这三步,你就可以拍着胸脯说:这个 DaaS 是正牌货。

4. 看到 DaaS 后到底该不该管、能不能删

4.1 它对咱们自己的 WebJob 有什么影响

先说结论:一般情况下,它对业务 WebJob 没有实质影响。

DaaS 是独立进程,运行在你的应用沙箱里,但它不监听你的业务端口,不改写你的数据库,也不会吃掉大量资源。它的存在更像是一台后台录像机,平时待机,出事才干活。

唯一可能让你感知到的问题是“默认站内存”。如果你的 App Service 计划比较小,比如在免费层或共享层,内存本身就不宽裕,DaaS 会占掉一部分。不过免费层的连续 WebJob 本来就受限,平台也可能不会让 DaaS 持续运行,所以影响有限。

另外,如果你用了 Always On,DaaS 会作为连续 WebJob 一直跑。如果你想省资源,不建议直接删 DaaS,而是先评估是否真的需要诊断能力。多数场景下,留着它的收益远大于那一点点资源开销。

4.2 为什么我不建议直接删掉它

很多人的第一反应是“把它目录删了,不就行了吗”。但实际试过就会发现,删除后过段时间它又会出现。为什么?

因为 DaaS 本质是平台管理链路的一部分。首当其冲,平台的诊断工具依赖这些文件。你从文件系统里硬删,等于把“体检医生”赶走了,等有一天应用崩溃、需要快速定位问题时,工具却拿不到 dump。其次,平台底层会检测组件完整性,你删掉目录后,它可能在下一次扩展同步或平台操作时重新注册。到时候你还要再排查一遍,浪费精力。

更麻烦的是,某些操作会误伤你自己的 WebJob。你可能会不小心把 DaaS 目录里的文件删除了一部分,只留下了半吊子状态。半残的 DaaS 虽然不致命,但会让门户里的诊断工具打不开,预警功能失效,最后你还是要找工单才能恢复。

4.3 如果你确实想让它消失,应该怎么办

如果你实在不希望列表里出现 DaaS,我建议按正规渠道处理,而不是硬删目录:

  • 打开 Azure 门户 → 你的应用服务 → 开发工具 → 扩展
  • 找到与 DaaS 或诊断相关的扩展项,看是否有卸载入口
  • 在“诊断并解决问题”页面里关闭自动诊断、崩溃监控等开关
  • 关闭 Always On(前提是你的业务 WebJob 不需要持续运行)

需要提醒的是:以上操作会弱化该应用的诊断能力。以后排查问题可能没那么方便了。我个人经验是,DaaS 不值得你花时间去和它较劲。它静静地替你盯着进程和内存,属于“养兵千日用兵一时”的角色。

5. 常见问题速查:DaaS 相关的那些坑

5.1 典型问题汇总表

平时群里看到很多朋友问 DaaS,我整理了一张速查表,遇到问题直接对着看:

现象排查方向结果/建议
WebJobs 列表里出现 DaaS,但我没部署过查看 Kudu 目录和 site extensions正常,平台诊断组件
DaaS 显示“已停止”或“终止”检查 Always On 是否开启连续 WebJob 需要 Always On 才能持续运行
DaaS 占用内存偏高查看当时是否正在做崩溃转储/诊断采集采集结束后会自动降下来,可稍等再观察
我删掉了 DaaS 目录,但后来又出现了平台扩展机制自动还原不要硬删,想禁用请走扩展安装入口
DaaS 和自己部署的 WebJob 重名检查是否使用了“DaaS”作为作业名建议改自己的作业名,避免目录冲突
诊断工具页面打不开检查 DaaS 相关文件是否被误删如果被误删,优先考虑重建或联系平台支持

这张表不是万能药,但覆盖了绝大多数 DaaS 相关疑问。遇到表里没有的问题时,先回到文件系统和进程这两层去看,基本不会跑偏。

5.2 几个容易被忽略的细节

除速查表以外,还有几个细节想单独提一下:

第一个,DaaS 不只在主站点出现。如果你配置了部署槽(Slot),每个槽位可能都会有自己的 DaaS WebJob。不要觉得是“多环境都中招了”,这是平台在每个槽位里都安装了诊断组件。

第二个,DaaS 对触发的诊断场景很敏感。比如在“诊断并解决问题”页面里点一下“CPU 分析”,DaaS 就会立刻活跃起来,开始采集进程信息和性能计数器。这时候你去 Kudu 看,会发现它的 CPU 占用明显升高。这是正常现象,不是被攻击。

第三个,如果你的应用是自己打包的镜像,也就是 Custom Container 那种模式,WebJobs 的目录约定和 DaaS 的表现可能不太一样。容器环境里 DaaS 的可见性更弱,通常需要进容器内部检查。遇到这种情况,别套用普通 WebJob 的结论。

6. 一次真实排查记录:从疑惑到放心的实操路径

6.1 某开发者的排查实录

我在模拟环境里复现过一次完整流程,以某开发者的身份来跑一遍,方便你在自己的环境里跟着做。

这位开发者经营着一个内部工具站,部署在 App Service 上,WebJobs 里有负责清理临时文件的定时任务。某天他登录门户,突然看见 WebJobs 列表里多了一个 DaaS,马上私信我,问是不是被勒索了。

我让他按下面顺序操作:

第一步,打开 Kudu:

https://他的应用名.scm.azurewebsites.net

进入 Debug Console → CMD,运行:

cd D:\home\site\wwwroot\App_Data\jobs\continuous dir

看到确实有DaaS文件夹后,再进到该目录:

cd DaaS type run.cmd dir /s

结果很正常,文件都是诊断相关的 dll,目录创建时间与他三天前开启“崩溃转储”功能的时间完全对上。这说明 DaaS 是那会儿被平台装上的,不是突然空降的。

第二步,在 Kudu 里打开:

https://他的应用名.scm.azurewebsites.net/api/siteextensions

JSON 响应里出现了 DaaS 扩展条目。这就等于平台亲口告诉你:我装的,别慌。

第三步,在 Process Explorer 里搜 DaaS 相关进程,看到它只在后台挂起,CPU 0%,内存占用不到 50 MB。日志目录里也只有几条诊断记录,没有任何外联痕迹。

结论:平台组件,放心保留。

6.2 这个案例能复制到你的环境里

如果你也遇到同样的问题,不用完全照搬,但思路是一样的:

一、先确认目录路径。二、看创建时间和文件签名。三、查扩展来源。四、看进程行为。这四步做完,基本就能判断是不是“真 DaaS”。

这套排查思路不只适用于 DaaS。以后任何你“没部署过却出现在应用目录里的文件”,先别急着删,也别急着恐慌,按同样路径去验证,比凭感觉猜可靠得多。

最后再分享一个能省不少事的小习惯:遇到不认识的东西,先去文件系统里看路径、创建时间、签名,再决定动不动它。这几个动作能在五分钟内判断出它是平台组件还是被人塞进来的不速之客。如果在你的环境里 DaaS 只是静静待在那里,我的建议就俩字:留着。这不是妥协,而是它在后台帮你盯着进程崩溃和内存问题,等真出事的时候,它能派上大用场。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询