از طریق منوی جستجو مطلب مورد نظر خود در وبلاگ را به سرعت پیدا کنید
اجرای دستورات شل با Node.jsSystem مدیران و توسعه دهندگان اغلب به اتوماسیون روی می آورند تا حجم کاری خود را کاهش دهند و فرآیندهای خود را بهبود بخشند. هنگام کار با سرورها، وظایف خودکار اغلب با اسکریپت های پوسته نوشته می شوند. با این حال، یک توسعه دهنده ممکن است ترجیح دهد از زبان سطح بالاتر عمومی تر برای کارهای پیچیده استفاده کند. بسیاری از برنامه ها نیز نیاز به تعامل با …
سرفصلهای مطلب
معرفی
مدیران و توسعه دهندگان سیستم اغلب برای کاهش حجم کاری و بهبود فرآیندهای خود به اتوماسیون روی می آورند. هنگام کار با سرورها، وظایف خودکار اغلب با اسکریپت های پوسته نوشته می شوند. با این حال، یک توسعه دهنده ممکن است ترجیح دهد از زبان سطح بالاتر عمومی تر برای کارهای پیچیده استفاده کند. بسیاری از برنامه ها همچنین نیاز به تعامل با سیستم فایل و سایر اجزای سطح سیستم عامل دارند، که اغلب با ابزارهای سطح خط فرمان آسان تر انجام می شود.
با Node.js می توانیم دستورات پوسته و process ورودی و خروجی آنها با استفاده از جاوا اسکریپت. بنابراین، ما می توانیم بیشتر این عملیات پیچیده را به جای زبان برنامه نویسی پوسته در جاوا اسکریپت بنویسیم و به طور بالقوه نگهداری برنامه را آسان تر می کند.
در این مقاله روش های مختلف اجرای دستورات پوسته در Node.js را با استفاده از child_process
مدول.
ماژول child_proccess
Node.js حلقه رویداد اصلی خود را در یک رشته واحد اجرا می کند. با این حال، این بدان معنا نیست که تمام پردازش آن در یک رشته انجام می شود. وظایف ناهمزمان در Node.js در رشته های داخلی دیگر اجرا می شوند. هنگامی که آنها کامل شدند، کد موجود در callback یا خطا به رشته اصلی و تک بازگردانده می شود.
این رشته های مختلف در همان Node.js اجرا می شوند process. با این حال، گاهی اوقات ایجاد دیگری مطلوب است process برای اجرای کد وقتی یک جدید process ایجاد می شود، سیستم عامل تعیین می کند که از کدام پردازنده استفاده می کند و چگونه وظایف خود را زمان بندی کند.
این child_process
ماژول فرآیندهای فرزند جدید Node.js اصلی ما را ایجاد می کند process. ما می توانیم دستورات پوسته را با این پردازش های فرزند اجرا کنیم.
استفاده از فرآیندهای خارجی در صورت استفاده صحیح می تواند عملکرد برنامه شما را بهبود بخشد. به عنوان مثال، اگر یکی از ویژگی های یک برنامه Node.js فشرده CPU باشد، زیرا Node.js تک رشته ای است، اجرای سایر وظایف را در حین اجرا مسدود می کند.
با این حال، میتوانیم آن کد منبع فشرده را به یک کودک واگذار کنیم process، فرض کنید یک برنامه C++ بسیار کارآمد است. کد Node.js ما آن برنامه C++ را در یک برنامه جدید اجرا می کند process، سایر فعالیت های خود را مسدود نمی کند و پس از تکمیل process خروجی آن
دو تابعی که برای اجرای دستورات پوسته استفاده خواهیم کرد عبارتند از exec()
و spawn()
.
این exec()
تابع
این exec()
تابع یک پوسته جدید ایجاد می کند و یک دستور داده شده را اجرا می کند. خروجی از اجرا بافر می شود، به این معنی که در حافظه نگهداری می شود و برای استفاده در تماس برگشتی در دسترس است.
بیایید استفاده کنیم exec()
عملکرد فهرست کردن همه پوشهها و فایلها در فهرست فعلی ما. در یک فایل Node.js جدید به نام lsExec.js
، کد زیر را بنویسید:
const { exec } = require("child_process");
exec("ls -la", (error, stdout, stderr) => {
if (error) {
console.log(`error: ${error.message}`);
return;
}
if (stderr) {
console.log(`stderr: ${stderr}`);
return;
}
console.log(`stdout: ${stdout}`);
});
اول، ما نیاز داریم child_process
ماژول در برنامه ما، به طور خاص با استفاده از exec()
عملکرد (از طریق تخریب ES6). بعد، ما را صدا می کنیم exec()
تابع با دو پارامتر:
- رشته ای با دستور shell که می خواهیم اجرا شود.
- یک تابع تماس با سه پارامتر:
error
،stdout
،stderr
.
فرمان پوسته ای که ما اجرا می کنیم این است ls -la
، که باید تمام فایل ها و پوشه های موجود در فهرست فعلی ما را خط به خط لیست کند، از جمله فایل ها/پوشه های مخفی. تابع callback ثبت می کند که آیا ما یک دریافت کرده ایم error
هنگام تلاش برای اجرای دستور یا خروجی روی پوسته stdout
یا stderr
جریان ها
توجه داشته باشید که
error
شی متفاوت ازstderr
. اینerror
وقتی شیء تهی نیستchild_process
ماژول موفق به اجرای یک فرمان نمی شود. اگر بخواهید اسکریپت Node.js دیگری را در آن اجرا کنید، ممکن است این اتفاق بیفتدexec()
اما برای مثال فایل پیدا نشد. از سوی دیگر، اگر دستور با موفقیت اجرا شود و پیامی را به جریان خطای استاندارد بنویسد،stderr
شی تهی نخواهد بود.
اگر آن فایل Node.js را اجرا کنید، باید خروجی مشابه زیر را ببینید:
$ node lsExec.js
stdout: total 0
drwxr-xr-x@ 9 arpan arpan 0 Dec 7 00:14 .
drwxr-xr-x@ 4 arpan arpan 0 Dec 7 22:09 ..
-rw-r--r--@ 1 arpan arpan 0 Dec 7 15:10 lsExec.js
child process exited with code 0
اکنون که روش اجرای دستورات را با آن فهمیدیم exec()
، بیایید روش دیگری برای اجرای دستورات با آن بیاموزیم spawn()
.
این spawn()
تابع
این spawn()
تابع یک دستور را در a اجرا می کند جدید process. این تابع از یک Stream API استفاده می کند، بنابراین خروجی دستور آن از طریق شنوندگان در دسترس قرار می گیرد.
مشابه قبل، ما از آن استفاده خواهیم کرد spawn()
عملکرد فهرست کردن همه پوشهها و فایلها در فهرست فعلی ما. بیایید یک فایل Node.js جدید ایجاد کنیم، lsSpawn.js
و موارد زیر را وارد کنید:
const { spawn } = require("child_process");
const ls = spawn("ls", ("-la"));
ls.stdout.روی("data", data => {
console.log(`stdout: ${data}`);
});
ls.stderr.روی("data", data => {
console.log(`stderr: ${data}`);
});
ls.روی('error', (error) => {
console.log(`error: ${error.message}`);
});
ls.روی("close", code => {
console.log(`child process exited with code ${code}`);
});
ما با نیاز به شروع می کنیم spawn()
تابع از child_process
مدول. سپس، ما یک جدید ایجاد می کنیم process که اجرا می کند ls
فرمان، پاس دادن -la
به عنوان یک استدلال توجه داشته باشید که چگونه آرگومان ها در یک آرایه نگهداری می شوند و در رشته فرمان گنجانده نمی شوند.
سپس شنوندگان خود را تنظیم می کنیم. این stdout
موضوع از ls
، آتش سوزی الف data
رویداد زمانی که دستور در آن جریان می نویسد. به طور مشابه، stderr
همچنین آتش می گیرد data
رویداد زمانی که دستور در آن جریان می نویسد.
خطاها با گوش دادن مستقیم به آنها کشف می شوند روی شیئی که مرجع دستور را ذخیره می کند. شما فقط یک خطا دریافت خواهید کرد اگر child_process
دستور را اجرا نمی کند.
این close
رویداد زمانی رخ می دهد که دستور به پایان برسد.
اگر این فایل Node.js را اجرا کنیم، باید مانند قبل خروجی بگیریم exec()
:
$ node lsSpawn.js
stdout: total 0
drwxr-xr-x@ 9 arpan arpan 0 Dec 7 00:14 .
drwxr-xr-x@ 4 arpan arpan 0 Dec 7 22:09 ..
-rw-r--r--@ 1 arpan arpan 0 Dec 7 15:10 lsExec.js
-rw-r--r--@ 1 arpan arpan 0 Dec 7 15:40 lsSpawn.js
child process exited with code 0
چه موقع باید استفاده کرد exec()
و spawn()
?
تفاوت کلیدی بین exec()
و spawn()
روش برگرداندن داده ها است. مانند exec()
تمام خروجی ها را در یک بافر ذخیره می کند، حافظه فشرده تر از آن است spawn()
، که خروجی را همانطور که می آید پخش می کند.
به طور کلی، اگر انتظار ندارید حجم زیادی از داده ها برگردانده شود، می توانید از آن استفاده کنید exec()
برای سادگی. نمونههای خوبی از موارد استفاده ایجاد یک پوشه یا گرفتن وضعیت یک فایل است. با این حال، اگر انتظار دارید مقدار زیادی خروجی از دستور خود داشته باشید، باید از آن استفاده کنید spawn()
. یک مثال خوب استفاده از دستورات برای دستکاری داده های باینری و سپس بارگذاری آن ها در برنامه Node.js است.
نتیجه
Node.js می تواند دستورات پوسته را با استفاده از استاندارد اجرا کند child_process
مدول. اگر از exec()
تابع، دستور ما اجرا می شود و خروجی آن در یک callback در دسترس ما خواهد بود. اگر از spawn()
ماژول، خروجی آن از طریق شنوندگان رویداد در دسترس خواهد بود.
اگر برنامه ما انتظار خروجی زیادی از دستورات ما دارد، باید ترجیح دهیم spawn()
بر فراز exec()
. اگر نه، ممکن است ما استفاده کنیم exec()
برای سادگی آن
اکنون که میتوانید وظایف خارجی Node.js را اجرا کنید، چه برنامههایی را میسازید؟
(برچسبها برای ترجمه)# جاوا اسکریپت
منتشر شده در 1403-01-23 07:05:03