nodejs呼叫指令碼(python/shell)和系統命令

來源:互聯網
上載者:User

nodejs呼叫指令碼(python/shell)和系統命令
NodeJS 子進程提供了與系統互動的重要介面,其主要 API 有:  標準輸入、標準輸出及標準錯誤輸出的介面 child.stdin 擷取標準輸入 child.stdout 擷取標準輸出 child.stderr 擷取標準錯誤輸出 擷取子進程的PID:child.pid 提供產生子進程的方法:child_process.spawn(cmd, args=[], [options]) 提供直接執行系統命令的方法:child_process.exec(cmd, [options], callback) 提供呼叫指令碼檔案的方法:child_process.execFile(file, [args], [options], [callback])提供殺死進程的方法:child.kill(signal='SIGTERM') 用執行個體來感受一下,很有意思的,呵呵~~   1、利用子進程調用系統命令(擷取系統記憶體使用量情況) 建立nodejs檔案,名為cmd_spawn.js,代碼如下:  var spawn = require('child_process').spawn;free = spawn('free', ['-m']);  // 捕獲標準輸出並將其列印到控制台 free.stdout.on('data', function (data) { console.log('standard output:\n' + data); });  // 捕獲標準錯誤輸出並將其列印到控制台 free.stderr.on('data', function (data) { console.log('standard error output:\n' + data); });  // 註冊子進程關閉事件 free.on('exit', function (code, signal) { console.log('child process eixt ,exit:' + code); }); 下面是運行該指令碼和直接運行命令'free -m'的結果,一模一樣:     2、執行系統命令(child_process.exec()) 這個我還是很常用的,功能感覺比上面的強大那麼一點點。比如我很喜歡關注天氣,現在我要curl一下天氣的介面返回json格式的資料,可能我要對它進行一番操作,這裡就列印出來不操作。 建立nodejs檔案,名為cmd_exec.js:  var exec = require('child_process').exec; var cmdStr = 'curl http://www.weather.com.cn/data/sk/101010100.html';exec(cmdStr, function(err,stdout,stderr){    if(err) {        console.log('get weather api error:'+stderr);    } else {        /*        這個stdout的內容就是上面我curl出來的這個東西:        {"weatherinfo":{"city":"北京","cityid":"101010100","temp":"3","WD":"西北風","WS":"3級","SD":"23%","WSE":"3","time":"21:20","isRadar":"1","Radar":"JC_RADAR_AZ9010_JB","njd":"暫無實況","qy":"1019"}}        */        var data = JSON.parse(stdout);        console.log(data);    }}); 來感受一下直接curl出來和通過運行指令碼的出來的結果是一樣一樣的:     3、調用傳參數的shell指令碼(child_process.execFile()) 這個要先準備個shell指令碼,比如我要連到一台伺服器,來修改它的密碼,則我要提供IP,user,new pwd,old pwd,建立shell指令檔change_password.sh:  #!/bin/sh IP=""NAME=""PASSWORD=""NEWPASSWORD="" while getopts "H:U:P:N:" arg #選項後面的冒號表示該選項需要參數do        case $arg in             H)                IP=$OPTARG                ;;             U)                NAME=$OPTARG                ;;             P)                PASSWORD=$OPTARG                ;;             N)                NEWPASSWORD=$OPTARG                ;;             ?)  #當有不認識的選項的時候arg為?            echo "含有未知參數"        exit 1        ;;        esacdone #先擷取useridUSERID=`/usr/bin/ipmitool -I lanplus -H $IP -U $NAME -P $PASSWORD user list | grep root | awk '{print $1}'`# echo $USERID#根據userid來修改密碼/usr/bin/ipmitool -I lanplus -H $IP -U $NAME -P $PASSWORD user set password $USERID $NEWPASSWORD 然後我準備個nodejs檔案來調用這個shell指令碼,叫file_changepwd.js:  var callfile = require('child_process'); var ip = '1.1.1.1';var username = 'test';var password = 'pwd';var newpassword = 'newpwd'; callfile.execFile('change_password.sh',['-H', ip, '-U', username, '-P', password, '-N', newpassword],null,function (err, stdout, stderr) {    callback(err, stdout, stderr);}); 這裡就不方便貼運行結果了,不過我可以用人格保證,它是經過測試的。 看過上面的,其實調用python指令碼就沒什麼懸念了,本質上也就是執行命令。   4、調用python指令碼(python指令碼本身是傳參數的) 這裡插入一個題外話,下面這段是對python傳參數的簡單說明一下:  # -*-coding:utf-8 -*-'''需要模組:sys參數個數:len(sys.argv)指令碼名:    sys.argv[0]參數1:     sys.argv[1]參數2:     sys.argv[2]'''import sysprint u"指令碼名:", sys.argv[0]for i in range(1, len(sys.argv)):#這裡參數從1開始    print u"參數", i, sys.argv[i]    我也來準備一個nodejs檔案來調用這個python指令碼(我對py_test.py做了修改,見下面),file_python.js:  var exec = require('child_process').exec;var arg1 = 'hello'var arg2 = 'jzhou'exec('python py_test.py '+ arg1+' '+arg2+' ',function(error,stdout,stderr){    if(stdout.length >1){        console.log('you offer args:',stdout);    } else {        console.log('you don\'t offer args');    }    if(error) {        console.info('stderr : '+stderr);    }}); py_test.py內容如下:# -*-coding:utf-8 -*-import sysprint sys.argv

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.