كل لغة لها مزاياها الخاصة. فهو يجمع بين بعضها البعض مع نقاط القوة الخاصة به لتنفيذ البرنامج بشكل أكثر كفاءة أو استخدام طريقة التنفيذ أكثر بساطة. تستخدم Nodejs عمليات الطفل لاتصال أوامر النظام أو الملفات. يتم عرض المستند على http://nodejs.org/api/Child_Process.html. توفر شركة NodeJS الفرعية واجهات مهمة للتفاعل مع النظام. تتضمن واجهات برمجة التطبيقات الرئيسية: الإدخال القياسي والإخراج القياسي وواجهات إخراج الخطأ القياسية.
توفر عملية الطفل NodeJS واجهات مهمة للتفاعل مع النظام ، وواجهة برمجة التطبيقات الرئيسية لها هي:
واجهات الإدخال القياسي والإخراج القياسي وإخراج الخطأ القياسي
child.stdin الحصول على مدخلات قياسية
child.stdout يحصل على الإخراج القياسي
child.stderr يحصل على إخراج الخطأ القياسي
احصل على pid من عملية الطفل: الطفل.
توفير طريقة لإنشاء عمليات الطفل: child_process.spawn (cmd ، args = [] ، [stions])
توفير طريقة لتنفيذ أوامر النظام مباشرة: child_process.exec (cmd ، [stions] ، رد الاتصال)
قدم طريقة لاستدعاء ملف البرنامج النصي: child_process.execfile (ملف ، [args] ، [Options] ، [Callback])
قدم طريقة لقتل العملية: child.kill (Signal = 'sigterm')
من المثير للاهتمام استخدام أمثلة لتجربة ذلك ، هاها ~~
1. استخدم عملية الطفل لاتصال أوامر النظام (احصل على استخدام ذاكرة النظام)
قم بإنشاء ملف nodejs جديد يسمى cmd_spawn.js ، الرمز كما يلي:
نسخة الكود كما يلي:
var تفرخ = مطلوب ('child_process'). تفرخ ؛
free = تفرخ ('Free' ، ['-m']) ؛
// التقاط الإخراج القياسي وطباعته إلى وحدة التحكم
free.stdout.on ('Data' ، function (data) {
console.log ('الإخراج القياسي:/n' + بيانات) ؛
}) ؛
// التقاط إخراج الخطأ القياسي وطباعته إلى وحدة التحكم
free.stderr.on ('Data' ، function (data) {
console.log ('إخراج الخطأ القياسي:/n' + بيانات) ؛
}) ؛
// تسجيل حدث إيقاف تشغيل عملية الطفل
free.on ('exit' ، function (code ، signal) {
console.log ('child process eixt ، exit:' + code) ؛
}) ؛
فيما يلي نتيجة تشغيل البرنامج النصي وتشغيل الأمر مباشرة "مجاني -M" ، بالضبط:
2. تنفيذ أوامر النظام (child_process.exec ())
ما زلت أستخدم هذا كثيرًا ، وتشعر الوظيفة بأقوى بقليل من ما سبق. على سبيل المثال ، أحب الانتباه إلى الطقس. الآن أريد تجعيد واجهة الطقس لإرجاع البيانات بتنسيق JSON. ربما أرغب في تشغيله ، لكنني سأطبعه هنا ولا أقوم بتشغيله.
قم بإنشاء ملف nodejs جديد يسمى cmd_exec.js:
نسخة الكود كما يلي:
var exec = required ('child_process'). exec ؛
var cmdstr = 'curl http://www.weather.com.cn/data/sk/101010100.html' ؛
exec (cmdstr ، function (err ، stdout ، stderr) {
إذا (خطأ) {
console.log ('Get Weather API خطأ:'+stderr) ؛
} آخر {
/*
محتوى هذا stdout هو الشيء الذي أتجول أعلاه:
{"WeatherInfo": {"City": "Beijing" ، "CityId": "101010100" ، "Temp": "3" ، "WD": "Northwest Wind" ، "WS": "Level 3 "،" SD ":" 23 ٪ "،" WSE ":" 3 "،" Time ":" 21:20 "،" Isradar ":" 1 "،" Radar ":" jc_radar_az9010_jb "، njd:
*/
var data = json.parse (stdout) ؛
console.log (البيانات) ؛
}
}) ؛
دعنا نختبر نتيجة حليقة مباشرة وتشغيل البرامج النصية هي نفسها:
3. اتصل بالبرنامج النصي shell الذي يمرر المعلمات (child_process.execfile ())
لهذا ، تحتاج إلى تحضير نص Shell أولاً. على سبيل المثال ، إذا كنت أرغب في الاتصال بخادم لتعديل كلمة المرور الخاصة به ، فأنا بحاجة إلى توفير IP ، المستخدم ، PWD جديد ، PWD القديم ، وإنشاء ملف SHELL SHELPLESTIOND_PASSWORD.SH:
نسخة الكود كما يلي:
#!/بن/ش
IP = ""
name = ""
كلمة المرور = ""
NewPassword = ""
بينما GetOpts "H: u: p: n:" arg #colon بعد الخيار يشير إلى أن الخيار يتطلب المعلمات
يفعل
حالة $ arg في
ح)
IP = $ optarg
؛؛
ش)
الاسم = $ optarg
؛؛
P)
كلمة المرور = $ optarg
؛؛
ن)
NewPassword = $ optarg
؛؛
؟) #عندما هناك خيارات لا تتعرف عليها ، arg هو؟
صدى "يحتوي على معلمات غير معروفة"
الخروج 1
؛؛
ESAC
منتهي
#get userId أولاً
userId = `/usr/bin/ipmitool -i lanplus -h $ ip -u $ name -p $ password list | جذر جريب | awk '{print $ 1}' `
# echo $ userId
#تعديل كلمة المرور وفقًا لـ UserId
/usr/bin/ipmitool -i lanplus -h $ ip -u $ name -p $ password 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) {
رد الاتصال (err ، stdout ، stderr) ؛
}) ؛
ليس من المناسب نشر نتائج الجري هنا ، لكن يمكنني استخدام الشخصية لضمان اختبارها.
بعد قراءة ما ورد أعلاه ، لا يوجد في الواقع التشويق للاتصال برامج نصية Python ، والتي تنفذ بشكل أساسي.
4. استدعاء السيناريو Python (Python Script نفسه يمرر المعلمات)
هنا الهاء. الفقرة التالية هي شرح موجز للمعلمات التي تم تمريرها على بيثون:
نسخة الكود كما يلي:
#-*-الترميز: UTF-8-*-
'' ''
الوحدة النمطية المطلوبة: sys
عدد المعلمات: Len (sys.argv)
اسم البرنامج النصي: sys.argv [0]
المعلمة 1: sys.argv [1]
المعلمة 2: sys.argv [2]
'' ''
استيراد SYS
طباعة u "اسم البرنامج النصي:" ، sys.argv [0]
لأني في المدى (1 ، لين (sys.argv)):#تبدأ المعلمة من 1
اطبع U "معلمة" ، أنا ، sys.argv [i]
نتائج التشغيل:
سأقوم أيضًا بإعداد ملف NodeJS للاتصال بهذا البرنامج النصي Python (قمت بإجراء تغييرات على py_test.py ، انظر أدناه) ، file_python.js:
نسخة الكود كما يلي:
var exec = required ('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 ('أنت تقدم args:' ، stdout) ؛
} آخر {
console.log ('you don/' t عرض args ') ؛
}
إذا (خطأ) {
console.info ('stderr:'+stderr) ؛
}
}) ؛
محتوى py_test.py كما يلي:
#-*-الترميز: UTF-8-*-
استيراد SYS
طباعة sys.argv
نتائج التشغيل كما يلي:
إنه جيد جدًا ، وأكملت مدونة رائعة لعام 2014. هاها ~~