精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

Node 腳本遭遇異常時如何安全退出

開發 前端
一個 Node 相關的項目中,總是少不了跑腳本。跑一個腳本拉取配置、處理一些數據以及定時任務更是家常便飯。

一個 Node 相關的項目中,總是少不了跑腳本。跑一個腳本拉取配置、處理一些數據以及定時任務更是家常便飯。

在一些重要流程中能夠看到腳本的身影:

  • CI,用以測試、質量保障及部署等
  • Docker,用以構建鏡像
  • Cron,用以定時任務

如果在這些重要流程中腳本出錯無法及時發現問題,將有可能引發更加隱蔽的問題。

最近觀察項目鏡像構建,會偶爾發現一兩個鏡像雖然構建成功,但容器卻跑不起來的情況。「究其原因,是因為 Exit Code 的問題」。

[[339305]]

Exit Code

什么是 exit code?

exit code 代表一個進程的返回碼,通過系統調用 exit_group 來觸發。在 POSIX 中,0 代表正常的返回碼,1-255 代表異常返回碼,一般主動拋出的錯誤碼都是 1。在 Node 應用中使用 process.exitCode = 1 來代表因不期望的異常而中斷。

這里有一張關于異常碼的附表 Appendix E. Exit Codes With Special Meanings[1]。

異常碼在操作系統中隨處可見,以下是一個關于 cat 命令的異常以及它的 exit code,并使用 strace 追蹤系統調用。

  1. $ cat a 
  2. cat: a: No such file or directory 
  3.  
  4. # 使用 strace 查看 cat 的系統調用 
  5. # -e 只顯示 write 與 exit_group 的系統調用 
  6. $ strace -e write,exit_group cat a 
  7. write(2, "cat: ", 5cat: )                    = 5 
  8. write(2, "a", 1a)                        = 1 
  9. write(2, ": No such file or directory", 27: No such file or directory) = 27 
  10. write(2, "\n", 1 
  11. )                       = 1 
  12. exit_group(1)                           = ? 
  13. +++ exited with 1 +++ 

從系統調用的最后一行可以看出,該進行的 exit code 是 1,并把錯誤信息輸出到 stderr (標準錯誤的 fd 為 2) 中

如何查看 exit code

從 strace 中可以來判斷進程的 exit code,但是不夠方便過于冗余,特別身處 shell 編程環境中。

「有一種簡單的方法,通過 echo $? 來確認返回碼」

  1. $ cat a 
  2. cat: a: No such file or directory 
  3.  
  4. $ echo $? 

throw new Error與Promise.reject區別

以下是兩段代碼,第一段拋出一個異常,第二段 Promise.reject,兩段代碼都會如下打印出一段異常信息,那么兩者有什么區別?

  1. function error () { 
  2.   throw new Error('hello, error') 
  3.  
  4. error() 
  5.  
  6. // Output: 
  7.  
  8. // /Users/shanyue/Documents/note/demo.js:2 
  9. //   throw new Error('hello, world') 
  10. //   ^ 
  11. // 
  12. // Error: hello, world 
  13. //     at error (/Users/shanyue/Documents/note/demo.js:2:9) 
  14. //     at Object.<anonymous> (/Users/shanyue/Documents/note/demo.js:5:1) 
  15. //     at Module._compile (internal/modules/cjs/loader.js:701:30) 
  1. function error () { 
  2.   throw new Error('hello, error') 
  3.  
  4. error() 
  5.  
  6. // Output: 
  7.  
  8. // /Users/shanyue/Documents/note/demo.js:2 
  9. //   throw new Error('hello, world') 
  10. //   ^ 
  11. // 
  12. // Error: hello, world 
  13. //     at error (/Users/shanyue/Documents/note/demo.js:2:9) 
  14. //     at Object.<anonymous> (/Users/shanyue/Documents/note/demo.js:5:1) 
  15. //     at Module._compile (internal/modules/cjs/loader.js:701:30) 

在對上述兩個測試用例使用 echo $? 查看 exit code,我們會發現 throw new Error() 的 exit code 為 1,而 Promise.reject() 的為 0。

「從操作系統的角度來講,exit code 為 0 代表進程成功運行并退出,此時即使有 Promise.reject,操作系統也會視為它執行成功。」

這在 Dockerfile 與 CI 中將留有安全隱患。

Dockerfile 在 node 中的注意點

當使用 Dockerfile 構建鏡像時,如果 RUN 的進程返回非 0 的返回碼,構建就會失敗。

「而在 Node 中的錯誤處理中,我們傾向于所有的異常都交由 async/await 來處理,而當發生異常時,由于此時 exit code 為 0 并不會導致鏡像構建失敗。」

這是一個淺顯易懂的含 Promise.reject() 問題的鏡像。

  1. FROM node:12-alpine 
  2.  
  3. RUN node -e "Promise.reject('hello, world')" 

構建鏡像過程如下:「即使在構建過程打印出了 unhandledPromiseRejection 信息,但是鏡像仍然構建成功。」

  1. $ docker build -t demo . 
  2. Sending build context to Docker daemon  33.28kB 
  3. Step 1/2 : FROM node:12-alpine 
  4.  ---> 18f4bc975732 
  5. Step 2/2 : RUN node -e "Promise.reject('hello, world')" 
  6.  ---> Running in 79a6d53c5aa6 
  7. (node:1) UnhandledPromiseRejectionWarning: hello, world 
  8. (node:1) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). To terminate the node process on unhandled promise rejection, use the CLI flag `--unhandled-rejections=strict` (see https://nodejs.org/api/cli.html#cli_unhandled_rejections_mode). (rejection id: 1) 
  9. (node:1) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code. 
  10. Removing intermediate container 79a6d53c5aa6 
  11.  ---> 09f07eb993fe 
  12. Successfully built 09f07eb993fe 
  13. Successfully tagged demo:latest 

Promise.reject 腳本解決方案

能在編譯時能發現的問題,絕不要放在運行時。所以,構建鏡像或 CI 中需要執行 node 腳本時,對異常處理需要手動指定 process.exitCode = 1 來提前暴露問題

  1. runScript().catch(() => { 
  2.   process.exitCode = 1 
  3. }) 

在構建鏡像時,也有關于異常解決方案的建議:

(node:1) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). To terminate the node process on unhandled promise rejection, use the CLI flag --unhandled-rejections=strict (see https://nodejs.org/api/cli.html#cli_unhandled_rejections_mode). (rejection id: 1)

根據提示,--unhandled-rejections=strict 將會把 Promise.reject 的退出碼設置為 1,并在將來的 node 版本中修正 Promise 異常退出碼。

  1. $ node --unhandled-rejections=strict error.js 

--unhandled-rejections=strict 的配置對 node 有版本要求:

Added in: v12.0.0, v10.17.0

By default all unhandled rejections trigger a warning plus a deprecation warning for the very first unhandled rejection in case no unhandledRejection hook is used.

總結

  • 當進程結束的 exit code 為非 0 時,系統會認為該進程執行失敗
  • 通過 echo $? 可查看終端上一進程的 exit code
  • Node 中 Promise.reject 時 exit code 為 0
  • Node 中可以通過 process.exitCode = 1 顯式設置 exit code
  • 在 Node12+ 中可以通過 node --unhandled-rejections=strict error.js執行腳本,視 Promise.reject 的 exit code 為 1

 

責任編輯:趙寧寧 來源: 全棧成長之路
相關推薦

2013-06-07 09:12:43

OpenDaylighBig SwitchSDN

2015-11-09 14:46:49

Android安全

2016-07-11 11:38:32

2011-04-18 09:03:22

2012-06-13 13:25:16

UNIX操作系統

2025-02-12 07:08:33

2025-04-22 00:05:00

2019-04-28 05:09:04

企業分支安全防御網絡犯罪

2015-07-07 09:29:50

2023-10-12 22:35:08

2021-12-30 08:13:00

JWT登錄令牌

2010-12-20 09:27:07

2025-09-11 08:55:16

2022-06-20 16:18:25

MySQL安全免密碼輸入

2024-08-30 12:53:52

2022-08-12 07:01:00

Node.jsXSS腳本

2013-08-16 09:43:26

2013-08-26 10:19:24

納斯達克數據專線交易暫停

2012-08-27 09:44:26

2018-01-09 04:50:39

點贊
收藏

51CTO技術棧公眾號

国产一区二区动漫| 欧美视频免费在线观看| 成人性生交大片免费看视频直播 | 天堂中文在线8| 久久国产日韩| 色妞在线综合亚洲欧美| 91精产国品一二三| 周于希免费高清在线观看| 欧美国产视频在线| 国产精品一区二区三区在线观| 国产精品久久久久久久久久精爆| 成人激情视频| 亚洲激情视频在线播放| 欧美一级特黄a| 999av小视频在线| 国产精品乱码久久久久久| 国产精成人品localhost| 久久精品99北条麻妃| 国产字幕视频一区二区| 中文欧美在线视频| 国产真实乱人偷精品| 动漫一区二区三区| 日韩欧美黄色动漫| 丁香婷婷综合激情| 美女黄视频在线观看| www欧美成人18+| 91成人在线看| 一级全黄少妇性色生活片| 亚洲三级视频| 欧美激情视频一区二区| jizzjizz日本少妇| 久久最新网址| 亚洲精品二三区| 91精品人妻一区二区三区蜜桃2| 成人看片网页| 色综合婷婷久久| 成年人午夜视频在线观看| 国产精品扒开做爽爽爽的视频| 久久综合九色综合97婷婷女人| av一区和二区| 国产三级精品在线观看| 麻豆高清免费国产一区| 国产福利精品av综合导导航| 国产成人精品片| 国自产拍偷拍福利精品免费一 | 男人晚上看的视频| 精品一区av| 亚洲天堂免费观看| 粉嫩av蜜桃av蜜臀av| 玖玖玖免费嫩草在线影院一区| 日韩午夜激情电影| 午夜福利123| www.久久久久爱免| 6080日韩午夜伦伦午夜伦| 亚洲欧美国产中文| 免费视频观看成人| 欧美日本在线看| 成人日韩在线视频| 色狠狠一区二区三区| 欧美在线你懂的| 五月婷婷六月丁香激情| 国产成+人+综合+亚洲欧美| 在线观看视频一区二区欧美日韩| 18岁视频在线观看| 欧美free嫩15| 欧美久久高跟鞋激| 五月天婷婷在线观看视频| 欧洲精品99毛片免费高清观看| 日韩一区二区在线看片| 日本少妇一区二区三区| 在线免费成人| 日韩一区二区三区视频在线观看| 欧美69精品久久久久久不卡 | 爽好多水快深点欧美视频| 日韩免费精品视频| 中文字幕第315页| 狠狠网亚洲精品| 高清国产在线一区| 香蕉视频免费看| 欧美国产日韩一二三区| 最新av网址在线观看| 第一中文字幕在线| 色婷婷综合中文久久一本| 国产日韩欧美久久| 一区二区亚洲视频| 亚洲跨种族黑人xxx| 免费成人深夜天涯网站| 一区二区日韩欧美| 欧美在线日韩在线| 一区二区www| 国产精品一区二区不卡| 国产一区二区不卡视频| 亚洲爆乳无码一区二区三区| 99re8在线精品视频免费播放| 色就是色欧美| 高h视频在线观看| 亚洲第一激情av| 毛片毛片毛片毛片毛片毛片毛片毛片毛片| 亚洲国产一区二区久久| 亚洲成人在线视频播放| 天天摸日日摸狠狠添| 国模 一区 二区 三区| 国产99久久精品一区二区永久免费| 91 中文字幕| 91女神在线视频| 日韩第一页在线观看| 涩涩涩视频在线观看| 91麻豆精品国产自产在线观看一区| 欧美一区二区免费在线观看| 人人狠狠综合久久亚洲婷婷| 久久久久久亚洲精品中文字幕| 91视频在线视频| 成人精品免费看| 亚洲永久一区二区三区在线| 女人让男人操自己视频在线观看| 欧美精品自拍偷拍| 疯狂揉花蒂控制高潮h| 久久久久久久久久久久久久| 国产91久久婷婷一区二区| 亚洲AV无码精品自拍| 中文字幕精品一区二区精品绿巨人 | 中文字幕亚洲影院| 精品在线91| 欧美成人精品不卡视频在线观看| 亚洲性猛交富婆| 99精品偷自拍| 成人性免费视频| 精品视频91| 日韩在线视频中文字幕| av大片在线免费观看| 大白屁股一区二区视频| 经典三级在线视频| 欧美三级电影网址| 91蝌蚪精品视频| 亚洲成av人**亚洲成av**| 久久久久久久久久久久久久国产| 欧美特黄不卡| 在线播放国产一区二区三区| 亚洲另类在线观看| av激情综合网| www.avtt| 激情小说亚洲色图| 久久久视频在线| 亚洲女人18毛片水真多| 亚洲精品免费一二三区| 日本成人xxx| 亚洲人成免费网站| 91欧美视频网站| 黄色视屏免费在线观看| 88在线观看91蜜桃国自产| 亚洲第一视频区| 美女在线视频一区| 亚洲自拍三区| 国产精品美女久久久久人| 日韩中文在线中文网在线观看| 在线观看不卡的av| 国产精品女主播av| 亚洲图色中文字幕| 91超碰成人| av激情久久| 国产福利电影在线播放| 日韩精品中文字幕在线观看| 亚洲第一在线播放| www国产精品av| 成人羞羞国产免费网站| 成人免费在线观看av| 国产自产女人91一区在线观看| 黄色网页网址在线免费| 欧美tk—视频vk| 在线观看免费国产视频| 久久精品视频一区二区| 污污的网站18| 欧美ab在线视频| 精品无人区一区二区三区| 深夜成人福利| 久久精品国产一区二区电影| 亚洲精品.www| 色婷婷激情综合| 中文字幕无码日韩专区免费 | 婷婷六月综合| 国产激情一区二区三区在线观看 | 亚洲天堂美女视频| 天堂va蜜桃一区二区三区 | 欧美日韩在线大尺度| 好吊色欧美一区二区三区| 欧美专区福利免费| 久久久国产一区二区| 五月婷婷深深爱| 日韩成人中文字幕| 国产成人在线免费视频| 久久伊99综合婷婷久久伊| 爆乳熟妇一区二区三区霸乳| 国产精品毛片久久| 国产精品视频免费观看| 最新日韩三级| 欧美人与性动交| 免费一级毛片在线观看| 欧美丰满嫩嫩电影| 日韩精品乱码久久久久久| 国产日韩欧美电影| 欧美一级片在线免费观看| 久久一区国产| 国内少妇毛片视频| 欧美影院三区| 国产欧美日韩综合精品二区| 国产一区二区主播在线| 欧美精品成人在线| 岛国最新视频免费在线观看| 欧美成人vps| 夜夜骚av一区二区三区| 欧美特黄级在线| 午夜少妇久久久久久久久| 国产日韩精品一区二区浪潮av | 国产东北露脸精品视频| 一本久道中文无码字幕av| 国产精品magnet| 亚洲在线不卡| 精品一区二区三区在线| 好吊色欧美一区二区三区| 精品亚洲a∨一区二区三区18| 国产成人一区二区三区| 国产精品vvv| 欧美高跟鞋交xxxxhd| 午夜在线小视频| 亚洲人成电影网站| 亚洲AV第二区国产精品| 精品国产sm最大网站免费看| 91亚洲国产成人久久精品麻豆| 色综合久久久久| 日本道在线观看| 亚洲午夜一区二区三区| 午夜69成人做爰视频| 国产精品久久午夜| 欧美福利第一页| 久久久亚洲精品石原莉奈| 在线天堂www在线国语对白| 国产成人综合网| 国产人妻精品久久久久野外| 精品一区二区三区久久久| 在线免费观看视频黄| 久久亚洲一区| 国产a级片免费观看| 蜜桃久久av| 欧美一级黄色片视频| 香蕉国产精品偷在线观看不卡| 奇米影视亚洲色图| 红桃视频欧美| 国产精品久久..4399| 黄色av日韩| 免费观看美女裸体网站| 一本久道久久久| 国产精品欧美激情在线观看| 六月婷婷一区| 成人性生生活性生交12| 三级影片在线观看欧美日韩一区二区 | 高h视频在线| 中文字幕视频在线免费欧美日韩综合在线看| 亚洲 小说区 图片区 都市| 亚洲欧美精品伊人久久| 国产福利在线看| 日韩在线视频二区| caopo在线| 国a精品视频大全| 亚洲精品动漫| 国产精品色视频| 国产免费av国片精品草莓男男| 亚洲专区国产精品| 国产图片一区| 欧美在线激情| 91精品动漫在线观看| 久久这里只有精品8| 国产视频一区在线观看一区免费| 少妇高清精品毛片在线视频| 蜜臀va亚洲va欧美va天堂| av在线免费看片| 成人美女在线观看| a毛片毛片av永久免费| 国产精品久久一级| 黄色小说在线观看视频| 色播五月激情综合网| 国产精品久久久久久久久久久久久久久久 | 国产裸体舞一区二区三区| 奇米888四色在线精品| 亚洲自拍第三页| 91在线视频免费91| 九一在线免费观看| 一区二区三区日韩在线观看| 久久99国产综合精品免费| 欧美三级电影网| 亚洲第一黄色片| 亚洲天堂av综合网| 在线免费观看的av| 日韩av片永久免费网站| 精品中文字幕一区二区三区四区| 国产一区免费| 婷婷综合视频| 成人观看免费完整观看| 激情丁香综合五月| 人妻丰满熟妇aⅴ无码| 1000部国产精品成人观看| 国产精品xxxx喷水欧美| 欧美日韩二区三区| 四虎在线免费看| 欧美成人精品一区二区三区| 成人免费网站www网站高清| 国产精品一区在线播放| 天天精品视频| 成人精品视频一区二区| 成人精品小蝌蚪| 欧美在线视频第一页| 欧美在线三级电影| 午夜在线观看视频18| 久热国产精品视频| 99re66热这里只有精品4| 精品在线视频一区二区三区| 欧美一区二区三区另类| 在线观看av日韩| 91欧美一区二区| 日韩精品在线不卡| 9191久久久久久久久久久| 成人精品一区二区| 欧美一区二三区| 国产suv精品一区| 久久久无码中文字幕久...| 免费成人av在线播放| 国产 欧美 在线| 欧美日韩亚洲视频一区| 亚洲欧美高清视频| 久久亚洲精品一区| 亚洲欧美一级| 亚洲一卡二卡三卡| 丝袜a∨在线一区二区三区不卡| 国产肉体xxxx裸体784大胆| 亚洲一二三四久久| www.国产免费| 欧美富婆性猛交| 91国内精品| 欧美激情亚洲天堂| 国产成人免费在线观看不卡| 日韩精品一区二区亚洲av性色| 欧美色涩在线第一页| 成人亚洲综合天堂| 国产精品久久久久久久久久小说| 亚洲精品国产动漫| 丝袜老师办公室里做好紧好爽| fc2成人免费人成在线观看播放| 久久精品www人人爽人人| 欧美va亚洲va| 国产黄大片在线观看| 久久精品国产美女| 香蕉国产精品偷在线观看不卡| 亚欧洲乱码视频| 在线影视一区二区三区| 国产黄色片在线播放| 国产精品一二区| 91精品国产91久久综合| 青娱乐精品在线| 亚洲午夜羞羞片| 性感美女一级片| 国产v综合ⅴ日韩v欧美大片| 视频一区中文| 色天使在线观看| 一区二区三区在线看| 手机在线观看毛片| 日本一区二区三区在线播放| 欧美在线免费看视频| 亚洲高清视频免费| 一区二区三区.www| 天堂а√在线8种子蜜桃视频| 人人澡人人澡人人看欧美| 精品国产a一区二区三区v免费| 色噜噜狠狠永久免费| 一区二区三区国产| 天堂av中文在线资源库| 国产精品欧美一区二区| 中文字幕一区二区精品区| 亚洲av成人片色在线观看高潮| 色天使色偷偷av一区二区| 日韩av中文| 国产精品一区二区你懂得| 丝袜亚洲另类丝袜在线| 黄色片子在线观看| 亚洲国产精品嫩草影院久久| 日本精品另类| 欧美久久久久久久久久久久久久| 91视频一区二区| 国产又黄又爽视频| 国内外成人免费激情在线视频网站| 欧美美女在线观看| 在线观看视频你懂得| 欧美日韩中文字幕在线| 毛片在线播放a| 欧美成ee人免费视频| 国产揄拍国内精品对白| 在线观看中文字幕视频| 久久人人爽人人爽爽久久| 日韩欧美四区| 日本一区二区三区在线免费观看| 日韩欧美亚洲一二三区| 99在线播放|