背景
1. 進(jìn)程管理
進(jìn)程管理主要是指創(chuàng)建,終止和監(jiān)控進(jìn)程。進(jìn)程管理器主要是用來(lái)確保你的應(yīng)用在啟動(dòng)后能夠保持在線。
2. pm2 是什么
pm2 是 nodejs 的進(jìn)程管理器饺饭,默認(rèn)支持負(fù)載均衡铺坞,能夠守護(hù)進(jìn)程起宽。還支持查看應(yīng)用運(yùn)行時(shí)的性能,資源占用情況等济榨。
3. 為什么要用 pm2
普通 node 進(jìn)程的缺陷
- 普通啟動(dòng)方式:node index.js燎含,關(guān)閉終端就結(jié)束進(jìn)程
- node 進(jìn)程掛掉和“僵死”:
- 進(jìn)程掛掉大概有以下幾種原因:
- 內(nèi)存泄漏:內(nèi)存一點(diǎn)點(diǎn)積累到達(dá)臨界值爆掉
- 死循環(huán)導(dǎo)致內(nèi)存突增爆掉
- 死循環(huán)導(dǎo)致磁盤寫爆
- 被動(dòng)被kill,主動(dòng)退出腿短。
- “僵死”大概有以下幾種可能:
- 有某個(gè)非常耗時(shí)的cpu操作正在執(zhí)行
- 寫了個(gè)死循環(huán)(死循環(huán)不一定會(huì)導(dǎo)致服務(wù)掛掉屏箍,有可能只會(huì)cpu飆升,讓服務(wù)處于假死狀態(tài))
- 進(jìn)程掛掉大概有以下幾種原因:
不管發(fā)生上面哪種情況橘忱,都會(huì)造成服務(wù)的不可訪問(wèn)赴魁,需要等我們自己去發(fā)現(xiàn)問(wèn)題后,然后重啟應(yīng)用钝诚。
pm2 啟動(dòng)的優(yōu)勢(shì)
- 后臺(tái)運(yùn)行:pm2可以后臺(tái)運(yùn)行颖御,終端關(guān)閉不影響。
- 自動(dòng)重啟:在應(yīng)用意外掛掉或者機(jī)器重啟后凝颇,能夠自動(dòng)重啟應(yīng)用
- 自動(dòng)負(fù)載均衡:支持集群模式潘拱,可以方便的啟動(dòng)多個(gè)node進(jìn)程,充分利用cpu和內(nèi)存
- 0 秒停機(jī)重啟:集群模式下拧略,可以達(dá)到重啟時(shí)不停止服務(wù)
- 可以監(jiān)控應(yīng)用性能芦岂,資源占用情況等,自動(dòng)輸出日志
- 開(kāi)發(fā)模式支持熱更新
使用
1. 安裝
pm2 本質(zhì)是一個(gè) cli 垫蛆,可以通過(guò) npm 進(jìn)行安裝
$ npm install pm2
# or
$ yarn add pm2
2. 啟動(dòng)
開(kāi)發(fā)模式
開(kāi)發(fā) node 應(yīng)用的時(shí)候禽最,修改代碼過(guò)后每次都要重啟下應(yīng)用,很麻煩袱饭。使用 pm2-dev
命令啟動(dòng)應(yīng)用川无,應(yīng)用會(huì)在在代碼發(fā)生變更過(guò)后,自動(dòng)重啟虑乖。
$ pm2-dev start server.js
生產(chǎn)模式
-
pm2 start
應(yīng)用部署到生產(chǎn)環(huán)境后懦趋,可以使用
pm2 start
來(lái)啟動(dòng)應(yīng)用$ pm2 start server.js ┌─────┬───────────┬─────────────┬─────────┬─────────┬──────────┬────────┬──────┬───────────┬──────────┬──────────┬──────────┬──────────┐ │ id │ name │ namespace │ version │ mode │ pid │ uptime │ ? │ status │ cpu │ mem │ user │ watching │ ├─────┼───────────┼─────────────┼─────────┼─────────┼──────────┼────────┼──────┼───────────┼──────────┼──────────┼──────────┼──────────┤ │ 0 │ server │ default │ 0.1.0 │ fork │ 17471 │ 71s │ 0 │ online │ 0% │ 77.5mb │ ayo │ disabled │ └─────┴───────────┴─────────────┴─────────┴─────────┴──────────┴────────┴──────┴───────────┴──────────┴──────────┴──────────┴──────────┘
該命令啟動(dòng)的應(yīng)用,默認(rèn)支持進(jìn)程守護(hù)疹味,并且可以通過(guò) pm2 進(jìn)行監(jiān)控
-
一些可以傳給 cli 的常用配置
-
--name <app_name>
指定應(yīng)用名仅叫。不傳的話默認(rèn)為應(yīng)用入口文件的文件名。如上圖的 server
-
--watch
在文件發(fā)生變化時(shí)自動(dòng)重啟佛猛。類似于開(kāi)發(fā)模式的
pm2-dev start
命令 -
--max-memory-restart <200MB>
該配置項(xiàng)設(shè)置后惑芭,應(yīng)用會(huì)在運(yùn)行內(nèi)存達(dá)到設(shè)定值
200MB
后,自動(dòng)重啟继找。避免了 Node.js heap out of memory error 問(wèn)題。 -
--log <log_path>
指定日志輸出目錄
-
--restart-delay <delay in ms>
設(shè)置自動(dòng)重啟的延遲時(shí)間
-
--cron <cron_pattern>
定時(shí)任務(wù)逃沿∮ざ桑可以設(shè)置 一天中的固定重啟時(shí)間幻锁, 一周內(nèi)固定重啟日期,或者 一個(gè)時(shí)間間隔(如 每 48 小時(shí)重啟一次)边臼。cron_pattern 請(qǐng)參照這里
-
--no-autorestart
關(guān)掉應(yīng)用的自動(dòng)重啟
-
更多配置請(qǐng)參照 集成部署EcosystemFile
3. 管理進(jìn)程
下面是部分常用命令行
$ pm2 restart app_name
$ pm2 reload app_name
$ pm2 stop app_name
$ pm2 delete app_name
-
app_name
的位置除了傳應(yīng)用名哄尔,還可以傳:-
all
針對(duì)所有進(jìn)程進(jìn)行操作 -
id
針對(duì)特定id的進(jìn)程進(jìn)行操作
-
- 集群模式下,restart中斷服務(wù)柠并,而reload不會(huì)
詳細(xì)介紹下以下命令:
查看應(yīng)用列表 pm2 list
$ pm2 list
┌─────┬───────────┬─────────────┬─────────┬─────────┬──────────┬────────┬──────┬───────────┬──────────┬──────────┬──────────┬──────────┐
│ id │ name │ namespace │ version │ mode │ pid │ uptime │ ? │ status │ cpu │ mem │ user │ watching │
├─────┼───────────┼─────────────┼─────────┼─────────┼──────────┼────────┼──────┼───────────┼──────────┼──────────┼──────────┼──────────┤
│ 0 │ app │ default │ 1.0.0 │ fork │ 16573 │ 9m │ 0 │ online │ 0% │ 57.3mb │ ayo │ disabled │
│ 2 │ index │ default │ 1.0.0 │ fork │ 0 │ 0 │ 16 │ errored │ 0% │ 0b │ ayo │ disabled │
│ 1 │ server │ default │ 0.1.0 │ fork │ 17471 │ 71s │ 0 │ online │ 0% │ 77.5mb │ ayo │ disabled │
└─────┴───────────┴─────────────┴─────────┴─────────┴──────────┴────────┴──────┴───────────┴──────────┴──────────┴──────────┴──────────┘
運(yùn)行上面的命令后岭接,可以查看所有 pm2 啟動(dòng)的應(yīng)用
-
id
:應(yīng)用 id -
name
:應(yīng)用名稱 -
namespace
:在配置文件里面可以給應(yīng)用設(shè)置 namespace。設(shè)置后可以使用命令行單獨(dú)啟動(dòng)或停止某個(gè) namespace 的應(yīng)用臼予。詳細(xì)用法見(jiàn) 集成部署EcosystemFile -
mode
: 進(jìn)程的運(yùn)行方式鸣戴。分為fork
與cluster
。詳細(xì)介紹見(jiàn) 集群模式 -
pid
:進(jìn)程id -
uptime
:運(yùn)行時(shí)間 -
?
:重啟次數(shù)(從0開(kāi)始計(jì)數(shù)) -
status
:進(jìn)程是否在線 -
cpu
:cpu占用率 -
mem
:內(nèi)存占用大小
查看應(yīng)用詳情信息 pm2 show app_name|app_id
$ pm2 show server
Describing process with id 1 - name server
┌───────────────────┬──────────────────────────────────────────────────┐
│ status │ online │
│ name │ server │
│ namespace │ default │
│ version │ 0.1.0 │
│ restarts │ 0 │
│ uptime │ 60m │
│ script path │ /home/ayo/dev/demo/analytics-dashboard/server.js │
│ script args │ N/A │
│ error log path │ /home/ayo/.pm2/logs/server-error.log │
│ out log path │ /home/ayo/.pm2/logs/server-out.log │
│ pid path │ /home/ayo/.pm2/pids/server-1.pid │
│ interpreter │ node │
│ interpreter args │ N/A │
│ script id │ 1 │
│ exec cwd │ /home/ayo/dev/demo/analytics-dashboard │
│ exec mode │ fork_mode │
│ node.js version │ 17.0.0 │
│ node env │ N/A │
│ watch & reload │ ? │
│ unstable restarts │ 0 │
│ created at │ 2021-12-03T08:33:01.489Z │
└───────────────────┴──────────────────────────────────────────────────┘
運(yùn)行上面的命令后粘拾,可以查看應(yīng)用詳情信息窄锅。
除了 pm2 list
命令返回的信息以外,還可以獲取幾個(gè)常用信息:
-
script path
:?jiǎn)?dòng)入口的文件路徑 -
script args
:?jiǎn)?dòng)文件的參數(shù) -
error log path
:錯(cuò)誤日志的文件路徑 -
out log path
:輸出日志的文件路徑 -
exec mode
:進(jìn)程的模式 -
watch&reload
:是否開(kāi)啟監(jiān)聽(tīng)文件變動(dòng)重啟 -
unstable restarts
:不穩(wěn)定的重啟次數(shù)
查看日志 pm2 logs
$ pm2 logs
C:\Users\fish2\.pm2\pm2.log last 15 lines:
PM2 | 2022-06-22T17:26:49: PM2 log: Concurrent actions : 2
PM2 | 2022-06-22T17:26:49: PM2 log: SIGTERM timeout : 1600
PM2 | 2022-06-22T17:26:49: PM2 log: ===============================================================================
PM2 | 2022-06-22T17:26:49: PM2 log: App [server:0] starting in -fork mode-
PM2 | 2022-06-22T17:26:49: PM2 log: App [server:0] online
PM2 | 2022-06-23T08:57:15: PM2 log: Stopping app:server id:0
PM2 | 2022-06-23T08:57:15: PM2 log: App [server:0] exited with code [1] via signal [SIGINT]
PM2 | 2022-06-23T08:57:15: PM2 log: pid=18708 msg=process killed
PM2 | 2022-06-23T09:35:21: PM2 log: App [server:0] starting in -fork mode-
PM2 | 2022-06-23T09:35:21: PM2 log: App [server:0] online
PM2 | 2022-06-23T09:59:15: PM2 log: Stopping app:server id:0
PM2 | 2022-06-23T09:59:15: PM2 log: App [server:0] exited with code [1] via signal [SIGINT]
PM2 | 2022-06-23T09:59:15: PM2 log: pid=7828 msg=process killed
PM2 | 2022-06-23T10:05:22: PM2 log: App [server:0] starting in -fork mode-
PM2 | 2022-06-23T10:05:22: PM2 log: App [server:0] online
C:\Users\fish2\.pm2\logs\server-error.log last 15 lines:
C:\Users\fish2\.pm2\logs\server-out.log last 15 lines:
0|server | [Symbol(kNeedDrain)]: false,
0|server | [Symbol(corked)]: 0,
0|server | [Symbol(kOutHeaders)]: [Object: null prototype]
0|server | },
0|server | _currentUrl: 'http:undefined/appmarket/api/client/types/',
0|server | [Symbol(kCapture)]: false
0|server | },
0|server | response: undefined,
0|server | isAxiosError: true,
0|server | toJSON: [Function (anonymous)]
0|server | }
0|server | ERR! [SSR] generate html template error
0|server | [SSR] generating html content
0|server | [SSR] generating html content
0|server | [SSR] generating html content
還可以直接進(jìn)入日志保存的目錄查看缰雇。示例中日志目錄為:C:\Users\fish2\.pm2\pm2.log
監(jiān)控所有進(jìn)程 pm2 monit
- 左上角 Process list:進(jìn)程列表
- 右上角 Logs:所有實(shí)時(shí)日志
- 左下角 Custom Metrics:當(dāng)前選中進(jìn)程的指標(biāo)
- 右下角 Metadata:進(jìn)程的信息
集成部署EcosystemFile
當(dāng)我們需要管理多個(gè)應(yīng)用入偷,或者應(yīng)用有多個(gè)運(yùn)行環(huán)境時(shí),使用 pm2 start
來(lái)啟動(dòng)應(yīng)用+配置參數(shù)是很不方便的械哟。所以疏之,pm2 支持使用配置文件來(lái)啟動(dòng)和管理應(yīng)用。
1. 生成配置文件
$ pm2 init simple
運(yùn)行該命令可在工程下初始化一個(gè) ecosystem.config.js
配置文件
module.exports = {
apps : [{
name : "app1",
script : "./app.js"
}]
}
app是要管理應(yīng)用的數(shù)組暇咆,每個(gè)對(duì)象都是一個(gè)應(yīng)用的配置
你也可以自己創(chuàng)建一個(gè)配置文件体捏,文件名以
.config.js
結(jié)尾,pm2 會(huì)自動(dòng)識(shí)別并讀取該文件糯崎。
2. 配置項(xiàng)
基礎(chǔ)配置
- name:進(jìn)程名
- script:node 啟動(dòng)文件的路徑
- cwd :項(xiàng)目所在的目錄
- args :通過(guò)命令行傳遞給node啟動(dòng)文件的參數(shù)
- interpreter :編譯器的絕對(duì)路徑(默認(rèn) node )
- interpreter_args :傳給編譯器的參數(shù)
- node_args:傳給 node 的參數(shù)
進(jìn)階配置
- instances :應(yīng)用啟動(dòng)實(shí)例個(gè)數(shù)几缭,僅在cluster模式有效
- exec_mode :應(yīng)用程序啟動(dòng)模式∥帜兀可選
cluster
或fork
年栓,默認(rèn)為fork
- watch :是否啟用監(jiān)控模式,默認(rèn)是
false
薄霜。如果設(shè)置成true
某抓,當(dāng)應(yīng)用程序變動(dòng)時(shí),pm2會(huì)自動(dòng)重載 - ignore_watch :不用監(jiān)聽(tīng)的文件惰瓜,如:
ignore_watch: [ 'node_modules', 'logs', ]
- max_memory_restart :應(yīng)用運(yùn)行內(nèi)存達(dá)到設(shè)定值后否副,會(huì)自動(dòng)重啟。避免了 Node.js heap out of memory error 問(wèn)題
- env :應(yīng)用中的默認(rèn)環(huán)境變量
- env_ :命令行中可傳入的環(huán)境變量崎坊,覆蓋默認(rèn)環(huán)境變量
- source_map_support :默認(rèn)
true
备禀,支持 sourcemap 文件
日志配置
- log_date_format :日志時(shí)間格式
- error_file :錯(cuò)誤日志存放路徑
- out_file :全部日志存放路徑
- combine_logs:是否將不同 id 的進(jìn)程日志合并
- merge_logs:同上
控制流
-
min_uptime:應(yīng)用被視為已啟動(dòng)最小運(yùn)行時(shí)間
min uptime of the app to be considered started
-
max_restarts: 在應(yīng)用狀態(tài)被認(rèn)定為
error
前,一定時(shí)間(min_uptime
指定的時(shí)間,若未配置曲尸,則為 1 秒)內(nèi)的連續(xù)不穩(wěn)定重啟次數(shù)number of consecutive unstable restarts (less than 1sec interval or custom time via min_uptime) before your app is considered errored and stop being restarted
以上兩個(gè)配置項(xiàng)一般需要同時(shí)設(shè)置赋续。
示例:
server.js
setTimeout(function () {
console.log('killed');
process.exit(1)
}, 1000);
ecosystem.config.js
module.exports = {
apps: [{
name: "app-market",
script: "./server.js",
max_restarts: 4,
min_uptime: 5000,
}]
}
如示例所示,server 應(yīng)用在啟動(dòng) 1s 后另患,會(huì)自己強(qiáng)行結(jié)束進(jìn)程纽乱。這時(shí), pm2 由于進(jìn)程守護(hù)的特性昆箕,會(huì)去重新拉起應(yīng)用鸦列。示例中設(shè)置了 min_uptime
為 5000(即 5s),max_restarts
為 4 次鹏倘,所以 pm2 在進(jìn)程停止(1s)后去重啟進(jìn)程薯嗤,5s 鐘可以內(nèi)重啟次數(shù)肯定可以達(dá)到 4 次。達(dá)到設(shè)定次數(shù)后第股,則停止重啟應(yīng)用应民。
當(dāng)?shù)?4 次重啟時(shí),應(yīng)用狀態(tài)將變?yōu)?error
夕吻,pm2 將停止重啟應(yīng)用诲锹。上圖重啟次數(shù)顯示為 3,是因?yàn)槭菑?0 開(kāi)始計(jì)數(shù)的(0涉馅, 1归园, 2, 3 共 4 次)
- listen_timeout:如果應(yīng)用沒(méi)有發(fā)送
ready
信號(hào)稚矿,間隔多長(zhǎng)時(shí)間 reload庸诱。單位為毫秒。 - wait_ready:是否等待進(jìn)程發(fā)送
ready
信號(hào)晤揣。默認(rèn)為false
桥爽。設(shè)置為true
后,需要在應(yīng)用內(nèi)部添加process.send('ready')
語(yǔ)句發(fā)送ready
信號(hào)昧识。
以上兩個(gè)配置項(xiàng)一般需要搭配使用钠四,詳細(xì)使用場(chǎng)景見(jiàn) 優(yōu)雅的啟動(dòng)與停止應(yīng)用
-
kill_timeout:從告訴進(jìn)程要關(guān)閉到強(qiáng)制關(guān)閉進(jìn)程的間隔時(shí)間。
module.exports = { apps : [{ name: 'app', script: './app.js', kill_timeout: 3000 }] }
當(dāng) pm2 要停止或重啟一個(gè)應(yīng)用時(shí)跪楞,會(huì)按順序給你的進(jìn)程發(fā)送一系列系統(tǒng)信號(hào)缀去。它首先會(huì)發(fā)送一個(gè)
SIGINT
信號(hào)告訴你應(yīng)用將會(huì)被停止。然后 pm2 會(huì)等待 3s(示例中kill_timeout
設(shè)置的時(shí)間)甸祭。若 3s 后應(yīng)用沒(méi)有自己停止(exit)缕碎,pm2 會(huì)發(fā)送一個(gè)SIGKILL
信號(hào)來(lái)強(qiáng)制停止應(yīng)用。When a process is stopped/restarted by PM2, some system signals are sent to your process in a given order.
First a SIGINT a signal is sent to your processes, signal you can catch to know that your process is going to be stopped. If your application does not exit by itself before 1.6s (customizable) it will receive a SIGKILL signal to force the process exit.詳細(xì)使用場(chǎng)景見(jiàn) 優(yōu)雅的啟動(dòng)與停止應(yīng)用
-
shutdown_with_message:使用
process.send(‘shutdown’)
方式來(lái)代替process.kill(pid, SIGINT)
停止應(yīng)用池户。默認(rèn)值為false
咏雌。
主要用于進(jìn)程無(wú)法使用信號(hào)流來(lái)關(guān)閉的場(chǎng)景凡怎。When signals are not available your process gets killed. In that case you have to use --shutdown-with-message via CLI or shutdown_with_message in Ecosystem File and listen for shutdown events.
restart_delay:進(jìn)程掉線后,等待多長(zhǎng)時(shí)間自動(dòng)重啟处嫌, 默認(rèn) 0s
autorestart: 是否開(kāi)啟自動(dòng)重啟栅贴。默認(rèn)開(kāi)啟斟湃。
cron_restart: 定時(shí)重啟熏迹。可以設(shè)置 一天中的固定重啟時(shí)間凝赛, 一周內(nèi)固定重啟日期注暗,或者 一個(gè)時(shí)間間隔(如 每 48 小時(shí)重啟一次)。cron_pattern 請(qǐng)參照這里
集群模式
1. pm2 的 cluster 模式與 fork 模式的區(qū)別
-
fork 模式
fork 模式使用最基本的進(jìn)程運(yùn)行方式墓猎,只是單實(shí)例運(yùn)行server捆昏,無(wú)法實(shí)現(xiàn) TCP 連接共享。并且:我們知道 JavaScript 代碼是運(yùn)行在單線程上的毙沾,換句話說(shuō)一個(gè) Node.js 進(jìn)程只能運(yùn)行在一個(gè) CPU 上骗卜。那么如果用 Node.js 來(lái)做 Web Server,就無(wú)法享受到多核運(yùn)算的好處
-
cluster 模式
集群模式允許 nodejs 應(yīng)用程序在所有可用的 CPU 上進(jìn)行擴(kuò)展左胞,而無(wú)需修改任何代碼寇仓。可以顯著提高應(yīng)用程序的性能和可靠性烤宙,具體取決于可用的 CPU 數(shù)量遍烦。在底層,它使用了 Node.js 集群模塊躺枕,這樣擴(kuò)展后的應(yīng)用程序的子進(jìn)程可以自動(dòng)共享服務(wù)器端口服猪。要了解更多信息,請(qǐng)參閱 Node.js 集群拐云。The cluster mode allows networked Node.js applications (http(s)/tcp/udp server) to be scaled across all CPUs available, without any code modifications. This greatly increases the performance and reliability of your applications, depending on the number of CPUs available. Under the hood, this uses the Node.js cluster module such that the scaled application’s child processes can automatically share server ports. To learn more, see How It Works in the official Node.js documentation on the cluster module.
2. 使用
- 命令行啟動(dòng)
$ pm2 start app.js -i max
max
的意思是:把應(yīng)用部署到服務(wù)器所有可用的CPU上罢猪,并運(yùn)行盡可能多的進(jìn)程
- 通過(guò)配置文件啟動(dòng)
ecosystem.config.js
module.exports = {
apps : [{
script : "app.js",
instances : "max",
exec_mode : "cluster"
}]
}
注意:pm2 的負(fù)載均衡的特性是建立在以集群模式啟動(dòng)的基礎(chǔ)上的,默認(rèn)的啟動(dòng)模式是 fork
叉瘩,不支持負(fù)載均衡
3. 重載 Reload
集群模式下膳帕,由于 pm2 的 restart
命令會(huì)先殺掉所有進(jìn)程,再重新拉起房揭,會(huì)造成服務(wù)終止备闲。但是 reload
命令可以實(shí)現(xiàn) 0s 重啟,維護(hù)升級(jí)的時(shí)候不需要停機(jī)捅暴。
當(dāng)重載時(shí)間過(guò)長(zhǎng)或者無(wú)法重載時(shí)恬砂,pm2 會(huì)自動(dòng)切換成 restart
4. 動(dòng)態(tài)擴(kuò)展
如果希望在運(yùn)行中動(dòng)態(tài)增加實(shí)例數(shù),可以使用下面的命令:
$ pm2 scale <app_name> +4 # add 4 additional workers in realtime
Docker 集成
1. 在容器中安裝 pm2
RUN npm install pm2 -g
2. 啟動(dòng) pm2
- 直接啟動(dòng)應(yīng)用
CMD ["pm2-runtime", "app.js"]
- 通過(guò)配置文件啟動(dòng)
CMD ["pm2-runtime", "ecosystem.config.js"]
注意:在容器中使用 pm2 啟動(dòng)應(yīng)用時(shí)蓬痒,要使用 pm2-runtime
而不是 pm2 start
, 因?yàn)椋?/strong>
pm2 是默認(rèn)后臺(tái)啟動(dòng)的泻骤, docker 感知不到。CMD 命令執(zhí)行完成,docker 容器就結(jié)束了狱掂。 所以直接使用
node app.js
啟動(dòng)應(yīng)用后演痒,應(yīng)用能一直在容器中保持運(yùn)行。 pm2 以后臺(tái)形式運(yùn)行趋惨,CMD 命令執(zhí)行完成鸟顺,docker 就認(rèn)為可以退出了。
所以需要使用 pm2-runtime
來(lái)進(jìn)行處理器虾。pm2-runtime
是為 Docker 容器設(shè)計(jì)的讯嫂,它將應(yīng)用程序置于前臺(tái),從而使容器保持運(yùn)行狀態(tài)兆沙。