แต่ละภาษามีข้อดีของตัวเอง มันรวมกันกับจุดแข็งของตัวเองเพื่อดำเนินการโปรแกรมได้อย่างมีประสิทธิภาพมากขึ้นหรือใช้วิธีการใช้งานที่ง่ายกว่า NodeJS ใช้กระบวนการเด็กเพื่อเรียกคำสั่งระบบหรือไฟล์ เอกสารจะแสดงที่ http://nodejs.org/api/child_process.html subprocess NodeJS ให้อินเทอร์เฟซที่สำคัญสำหรับการโต้ตอบกับระบบ API หลักของมัน ได้แก่ : อินพุตมาตรฐานเอาต์พุตมาตรฐานและอินเตอร์เฟสเอาต์พุตข้อผิดพลาดมาตรฐาน
กระบวนการเด็ก NODEJS ให้อินเทอร์เฟซที่สำคัญสำหรับการโต้ตอบกับระบบและ API หลักของมันคือ:
อินเตอร์เฟสสำหรับอินพุตมาตรฐานเอาต์พุตมาตรฐานและเอาต์พุตข้อผิดพลาดมาตรฐาน
child.stdin รับอินพุตมาตรฐาน
child.stdout ได้รับเอาต์พุตมาตรฐาน
child.stderr ได้รับเอาต์พุตข้อผิดพลาดมาตรฐาน
รับ PID ของกระบวนการเด็ก: child.pid
ให้วิธีการสร้างกระบวนการเด็ก: child_process.spawn (cmd, args = [], [ตัวเลือก])
ให้วิธีการเรียกใช้คำสั่งระบบโดยตรง: child_process.exec (CMD, [ตัวเลือก], การโทรกลับ)
ระบุวิธีการเรียกไฟล์สคริปต์: child_process.execfile (ไฟล์, [args], [ตัวเลือก], [callback])
จัดเตรียมวิธีการฆ่ากระบวนการ: เด็ก kill (signal = 'sigterm')
เป็นเรื่องที่น่าสนใจมากที่จะใช้ตัวอย่างเพื่อสัมผัสได้ฮ่าฮ่า ~~
1. ใช้กระบวนการเด็กเพื่อเรียกคำสั่งระบบ (รับการใช้หน่วยความจำระบบ)
สร้างไฟล์ nodejs ใหม่ชื่อ cmd_spawn.js รหัสมีดังนี้:
การคัดลอกรหัสมีดังนี้:
var spawn = ต้องการ ('child_process'). วางไข่;
ฟรี = วางไข่ ('ฟรี', ['-m']);
// จับเอาต์พุตมาตรฐานและพิมพ์ลงในคอนโซล
free.stdout.on ('data', function (data) {
console.log ('เอาต์พุตมาตรฐาน:/n' + ข้อมูล);
-
// จับเอาต์พุตข้อผิดพลาดมาตรฐานและพิมพ์ลงในคอนโซล
free.stderr.on ('data', function (data) {
console.log ('เอาต์พุตข้อผิดพลาดมาตรฐาน:/n' + ข้อมูล);
-
// ลงทะเบียนเหตุการณ์การปิดระบบเด็ก
free.on ('ออก', ฟังก์ชั่น (รหัส, สัญญาณ) {
console.log ('กระบวนการเด็ก EIXT, ออก:' + รหัส);
-
นี่คือผลลัพธ์ของการรันสคริปต์และเรียกใช้คำสั่งโดยตรง 'ฟรี -m' เหมือนกัน:
2. ดำเนินการคำสั่งระบบ (child_process.exec ())
ฉันยังคงใช้สิ่งนี้บ่อยมากและฟังก์ชั่นรู้สึกมีพลังมากกว่าด้านบนเล็กน้อย ตัวอย่างเช่นฉันชอบให้ความสนใจกับสภาพอากาศ ตอนนี้ฉันต้องการขดอินเตอร์เฟสสภาพอากาศเพื่อส่งคืนข้อมูลในรูปแบบ JSON บางทีฉันอาจต้องการใช้งาน แต่ฉันจะพิมพ์ที่นี่และไม่ใช้งาน
สร้างไฟล์ nodejs ใหม่ชื่อ cmd_exec.js:
การคัดลอกรหัสมีดังนี้:
var exec = ต้องการ ('child_process'). exec;
var cmdstr = 'curl http://www.weather.com.cn/data/sk/101010100.html';
EXEC (CMDSTR, function (err, stdout, stderr) {
ถ้า (err) {
console.log ('รับข้อผิดพลาด Weather API:'+stderr);
} อื่น {
-
เนื้อหาของ stdout นี้เป็นสิ่งที่ฉันขดอยู่ด้านบน:
{"WeatherInfo": {"City": "Beijing", "CityID": "101010100", "Temp": "3", "WD": "Northwest Wind", "WS": "ระดับ 3 "," SD ":" 23%"," WSE ":" 3 "," เวลา ":" 21:20 "," Isradar ":" 1 "," เรดาร์ ":" JC_RADAR_AZ9010_JB "," NJD ":
-
var data = json.parse (stdout);
console.log (ข้อมูล);
-
-
มาสัมผัสกับผลลัพธ์ของการขดโดยตรงและสคริปต์ที่ใช้งานเหมือนกัน:
3. เรียกเชลล์สคริปต์ที่ผ่านพารามิเตอร์ (child_process.execfile ())
สำหรับสิ่งนี้คุณต้องเตรียมเชลล์สคริปต์ก่อน ตัวอย่างเช่นหากฉันต้องการเชื่อมต่อกับเซิร์ฟเวอร์เพื่อแก้ไขรหัสผ่านฉันต้องจัดเตรียม IP ผู้ใช้ PWD ใหม่ PWD เก่าและสร้างไฟล์เชลล์สคริปต์ใหม่ Change_Password.sh:
การคัดลอกรหัสมีดังนี้:
#!/bin/sh
ip = ""
ชื่อ = ""
รหัสผ่าน = ""
newPassword = ""
ในขณะที่ getOpts "h: u: p: n:" arg #ลำไส้ใหญ่หลังจากตัวเลือกระบุว่าตัวเลือกต้องใช้พารามิเตอร์
ทำ
กรณี $ arg ใน
ชม)
ip = $ optarg
-
คุณ)
ชื่อ = $ optarg
-
P)
รหัสผ่าน = $ optarg
-
n)
newPassword = $ optarg
-
?) #เมื่อมีตัวเลือกที่คุณไม่รู้จัก Arg คือ?
echo "มีพารามิเตอร์ที่ไม่รู้จัก"
ออกจาก 1
-
ESAC
เสร็จแล้ว
#get userid ก่อน
userId = `/usr/bin/ipmitool -i lanplus -h $ ip -u $ name -p $ รหัสผ่านรายการผู้ใช้ | Grep Root | awk '{พิมพ์ $ 1}' `
# echo $ userid
#Modify รหัสผ่านตาม USERID
/usr/bin/ipmitool -i lanplus -h $ ip -u $ name -p $ รหัสผ่านชุดรหัสผ่านรหัสผู้ใช้ $ userid $ newpassword
จากนั้นฉันเตรียมไฟล์ nodejs เพื่อเรียกสคริปต์เชลล์นี้เรียกว่า file_changepwd.js:
การคัดลอกรหัสมีดังนี้:
var callfile = ต้องการ ('child_process');
var ip = '1.1.1.1';
ชื่อผู้ใช้ var = 'ทดสอบ';
var password = 'pwd';
var newPassword = 'newpwd';
callfile.execfile ('change_password.sh', ['-h', ip, '-u', ชื่อผู้ใช้, '-p', รหัสผ่าน, '-n', newpassword], null, function (err, stdout, stderr) {
การโทรกลับ (err, stdout, stderr);
-
ไม่สะดวกที่จะโพสต์ผลการทำงานที่นี่ แต่ฉันสามารถใช้บุคลิกภาพเพื่อให้แน่ใจว่าได้รับการทดสอบแล้ว
หลังจากอ่านข้างต้นแล้วไม่มีความสงสัยที่จะเรียกสคริปต์ Python ซึ่งเป็นการดำเนินการตามคำสั่ง
4. เรียกสคริปต์ Python (Python Script เองผ่านพารามิเตอร์)
นี่คือสิ่งที่ทำให้ไขว้เขว ย่อหน้าต่อไปนี้เป็นคำอธิบายสั้น ๆ ของพารามิเตอร์ที่ส่งผ่านใน Python:
การคัดลอกรหัสมีดังนี้:
#-*-การเข้ารหัส: UTF-8-*-
-
โมดูลที่ต้องการ: SYS
จำนวนพารามิเตอร์: LEN (SYS.ARGV)
ชื่อสคริปต์: sys.argv [0]
พารามิเตอร์ 1: sys.argv [1]
พารามิเตอร์ 2: sys.argv [2]
-
นำเข้า SYS
พิมพ์ U "ชื่อสคริปต์:", sys.argv [0]
สำหรับ i ในช่วง (1, len (sys.argv)):#พารามิเตอร์เริ่มจาก 1
พิมพ์ u "พารามิเตอร์", i, sys.argv [i]
ผลการทำงาน:
ฉันจะเตรียมไฟล์ nodejs เพื่อเรียกสคริปต์ Python นี้ (ฉันทำการเปลี่ยนแปลง py_test.py, ดูด้านล่าง), file_python.js:
การคัดลอกรหัสมีดังนี้:
var exec = ต้องการ ('child_process'). exec;
var arg1 = 'สวัสดี'
var arg2 = 'jzhou'
exec ('python py_test.py'+arg1+''+arg2+'', ฟังก์ชั่น (ข้อผิดพลาด, stdout, stderr) {
if (stdout.length> 1) {
console.log ('คุณเสนอ args:', stdout);
} อื่น {
console.log ('คุณ don/' t ข้อเสนอ args ');
-
ถ้า (ข้อผิดพลาด) {
console.info ('stderr:'+stderr);
-
-
เนื้อหาของ py_test.py มีดังนี้:
#-*-การเข้ารหัส: UTF-8-*-
นำเข้า SYS
พิมพ์ sys.argv
ผลการดำเนินการมีดังนี้:
มันค่อนข้างดีและฉันเสร็จบล็อกที่สวยงามสำหรับปี 2014 ฮ่าฮ่า ~~