當Shell遇上了NodeJS

2021-09-17 19:24:44 字數 2880 閱讀 7519

\\

無論在傳統的企業級系統維護還是在網際網路運維中,shell指令碼的編寫與維護常常必不可少,在系統管理員或開發人員工作中佔比重比較大的一部分。shell指令碼的嚴格語法格式對於一般的運維人員來說,常常會在一不留神下而抓狂或查詢半天才發現是因為多了或少了乙個空格或某語包括號不匹配而導致的錯誤,不但大大的浪費了指令碼維護人員的工作時間,還可能影響到工程進度甚至專案的發布里程碑等。當然,對於非純geek來說,最重要的還是影響心情,特別是對於一些較複雜的指令碼需求,更是必須小心謹慎,因此越來越多的開發人員必須借助於python、perl、ruby等相關的指令碼語言來實現,但是常由於平台的特性或者語言的限制,對系統級的命令呼叫或者異常處理有限制,最終解決起來並不是十分優雅。 nodejs的出現或許會給這些開發人員帶來一些新的選擇。

\\ 先看一段簡單的採用shell 指令碼執行一段命令得到其執行時間的指令碼diffa.sh:

\

\#!/bin/bash\start=$(date +%s)\# prepare things\du -m /home \u0026gt; /tmp/output\# done  end=$(date +%s)\diff=$(( $end - $start ))\echo \"化了$diff 秒搞定\"\chmod +x diff.sh\sh diff.sh
\

執行上面的指令碼後,結果如下:

\ 化了0 秒搞定

\ 使用者首次執行一般會耗時幾秒,多次執行的結果可能會在0-1秒之間隨機顯示。因為du的輸出重定向,整個指令碼的執行時間非常短,並且指令碼中採用的是秒數級別的範圍,如果需要得到這個指令碼的準確執行時間只能用納秒來進行,並在shell做除法運算,把指令碼修改一下diffb.sh。

\

\start=$(date +%s%n)\du -m /home/ \u0026gt;/tmp/output\end=$(date +%s%n)\diff=$(($end - $start))\sum=`expr $diff / 1000000`\echo \"化了$sum ms搞定\"
\
\#!/usr/bin/env node\\var util = require('util'),\    spawn = require('child_process').spawn,\    ls = spawn('du', ['-m', '/home/']);\var start = +new date();\ls.stdout.on('data', function (data) );\ls.stderr.on('data', function (data) );\ls.on('exit', function (code) );\
\

注:上面require中引用的都是系統內建模組,spawn的格式為spawn(command, [args], [options]),其他請參閱官方文件。

\ 同樣,chmod +x 對指令碼賦予執行許可權,執行指令碼./diff.js,結果如下:

\

\1113
\

上面示例中顯示的時間直接是毫秒級別,**格式沒有嚴格的限制,流程的控制也會更加靈活,特別是在異常情況下,可以根據使用者的需求處理更小的細節。當然,我承認這個示例需求有些詭異,但是做這樣的比較,並不是說要二者一決高下,只是換一種前端攻城師喜歡的方法去實現一些系統運維需求。在這裡nodejs指令碼本身也是依賴於系統shell的強大基礎之上。

\\ 以上示例可以看到,在shell環境中,nodejs內建模組實現常用的功能是即方便又靈活,linux shell環境中比較強大的功能之一就是支援輸入輸出重定向功能,用符號\u0026lt;和\u0026gt;來表示。0、1和2分別表示標準輸入、標準輸出和標準錯誤資訊輸出,用來指定需要重定向的標準輸入或輸出,比如 2\u0026gt;error.log表示將錯誤資訊輸出到檔案err.log中。類似的,nodejs中可以直接採用超複雜的命令來搞定,一般對於我們這些非系統管理員有一定的難度,下面引入強大點的模組procstreams,它可以實現輸出流重定向等功能,首先使用者需要執行npm install procstreams安裝模組,編寫示例如下wc.js:

\ 另外,使用者執行指令碼的時候還需要處理複雜一些的引數對應,node-optimist 及 isaacs's nopt 之類的模組可以非常簡單的幫助攻城師實現這樣的功能,如實現根據使用者的輸入的引數執行需要的系統命令,並可以做相關的邏輯處理的opt.js:

\ 使用者使用如下對應格式執行**:./opt.js --cmd=ls --args=/m --opt=/home,然後只需要在**相關處新增對應的邏輯**,把注意力放在業務層,採用js的流程控制實現業務邏輯的分離。

\\ 在企業線上或系統運維中,常需要對一些程序進行監控和報警,以便通知相關系統管理人員,如下shell指令碼 agenta.sh實現了對tomcat6程序監控,如果不存在自動重啟。

\

\#!/bin/sh\pid=`ps aux| grep \"tomcat6\" | grep -v grep | sed -n  '1p' | awk ''`\if [ -z $pid ]; then\        echo \"begin restart,please waiting...\"\        sudo /etc/init.d/tomcat6 restart\        exit 1\else\        echo -e \"exist ,don't need restart\"\fi
\

指令碼編寫人員在經過一番努力與折騰後,完成了**編寫與除錯工作,然後需要通過系統的crontab功能新增如0-59/2 * * * * sh agent.sh的定時任務,如果系統管理員把crontab的許可權給禁用了,那就需要得到系統管理員的幫助了。下面使用nodejs來實現同樣的功能,先假設讀者對grep、sed和awk等常用命令的使用有大概了解,**如下agentb.js:

\

\var p = require('procstreams');\var exec = require('child_process').exec;\setinterval(function () '\

當const遇上了指標

將指標指向常量物件,這樣可以防止使用指標來修改所指向的值 int num 6 const int p p 8 非法,不能改變指向常量物件的值 但是,物件num本身不是常量可以被修改 num 8 合法的 也就是說,它指向的那個值並不是常量,因此我們不能通過p來修改它指向的值但是可以修改num的值從而修...

《當阿呆遇上阿瓜》 當鐵鍬遇上石頭

該片是金 凱瑞成名之前在1994年給影迷奉獻的搞怪喜劇片 阿呆與阿瓜 的續集,說是續集,其實是前傳。新線公司讓我們足足等了10年才看到續集,然而此時影片的主創人員全部更換。少了金 凱瑞,似乎再沒有理由讓我們更期待看到這部影片。可別說筆者心態不正,筆者之所以看此片僅僅因為想看看新線公司是如何挖這塊金礦...

當技術遇上管理

哈佛商學院教授戴維 蓋兒文總結說過 我們的時間應該花在設計和除bug上,而不是不停地與上司打交道,或者監督別人的工作。作為乙個技術人員管理者,要麼你的技術能力徹底讓人信服,要麼你的想法與綜合能力高人一籌,而且還得顯得比手下的人要忙,不然誰心甘情願服從你的安排。很不巧,國內大多數公司裡,有些人的存在,...