شما هنوز به سیستم وارد نشده اید.

#1 2016-10-13 17:41:21

LinArcX
عضو
ثبت شده: 2015-09-18
ارسال ها: 735
وب سایت

مشکل در اجرای فراخوانی دستورات خاص لینوکس بوسیله جاوا[حل شد]

دوستان عرض ادب
در حال توسعه اپلیکیشنی هستم که نیازمند این هستش که به صورت متناوب دستوراتی از لینوکس رو اجرا کنه.مثلا آپدیت سیستم،کویری گرفتن از بخش های مختلف اون و الی آخر.
طی جستجوهایی که انجام دادم "در جاوا" میشه از کلاس Runtime استفاده کرد.بدین شکل:

Process p = Runtime.getRuntime().exec(inputCommand);

خروجی ش پروسه ای هست که میشه استرینگ خروجی هارو از توش در آورد:

BufferedReader reader = new BufferedReader(new InputStreamReader(p.getInputStream()));
		while ((line = reader.readLine()) != null) {
//extract favorite OutPut
}

به عنوان یه مثال ساده میخوام معماری سیستممو در بیارم:

Process p = Runtime.getRuntime().exec("uname -m");
BufferedReader reader = new BufferedReader(new InputStreamReader(p.getInputStream()));
	    while ((line = reader.readLine()) != null) {
//extract favorite OutPut
}

و خروجی اون چیزی شبیه زیره:

x86_64

تا اینجای کار همه چی گل و بلبله اما...
امان از وقتی که من دستور زیر رو صادر کردم(از systemctl استفاده کردم):

Process p = Runtime.getRuntime().exec("systemctl status tor.service | grep Active | cut -d' ' -f5");

اینجا هیچ خروجی ای بهم برنگردوند(nullPointerException)
و exitCode متغیر p هم 1 شد.(یعنی خروج ناموفق!) و طی پیامی بهم گفت که اصلا عبارت systemctl رو نشناخته!!!
علت چی میتونه باشه به نظرتون؟

آخرین ویرایش توسط LinArcX (2016-10-13 18:40:04)


"Enough!!!Don't Use "DEFAULTS" Any More..."make it simple stupid

آفلاین

#2 2016-10-13 17:54:39

morealaz
عضو
از : کرمان
ثبت شده: 2016-03-19
ارسال ها: 298

پاسخ: مشکل در اجرای فراخوانی دستورات خاص لینوکس بوسیله جاوا[حل شد]

سعیدجان تا اونجا که من می دونم systemctl status خروجی رو با استفاده از برنامه pager پیش فرض سیستم که معمولاً less هست نشون میده. شاید به خاطر همینه که شما خروجی مورد نظرت رو نگرفتی. به نظرم باید به شکل دیگه ای status بگیری که خروجی دستور متن باشه نه اینکه خروجی را پایپ کنه به less!!!

ویرایش:از آپشن no-pager-- استفاده کن برای خروجی ببین جواب میده. یعنی دستورت اینجوری باشه:

systemctl --no-pager status tor.service

آپشن های دیگه ای هم داره که فکر کنم بدردت بخوره (مثل آپشن output--) یه نگاه به راهنمای این برنامه بیانداز

آخرین ویرایش توسط morealaz (2016-10-13 18:04:57)

آفلاین

#3 2016-10-13 18:39:40

LinArcX
عضو
ثبت شده: 2015-09-18
ارسال ها: 735
وب سایت

پاسخ: مشکل در اجرای فراخوانی دستورات خاص لینوکس بوسیله جاوا[حل شد]

چه نکته باریک و زیبایی:)
کاری که گفتین رو انجام دادم محمد عزیز اما متاسفانه بازم حل نشد مشکلم.
به فکرم رسید بیام دستورات رو مجزا بنویسم.یعنی همون پایپی که تو دستورات خودم بود رو هم حذف کردم و در کمال تعجب دیدم که درسته!!مشکل از عملگر پایپ بوده.
در واقع عبارت:

Runtime.getRuntime().exec(inputCommand);

در هر زمان،"تنها" میتونه یه کامند واحد بگیره و به ازاش یه پروسه ایجاد میکنه و اون کامند در قالب اون پروسه اجرا میشه.(ما داشتیم جاوا و بش رو با هم گول میزدیم.در واقع پایپ یه ویژگی از شل لینوکس هست و کلاس Runtime درکی از اون نداره و حق هم داره خداییش big_smile)
حالا تو موقعیت هایی مثل موقعیت من که میخوام پایپ های پی در پی بزنم راه حل چیه؟!
راه حل استفاده از سوییچ -c متعلق به sh هست.(لیستی از کامند ها بهش میدی و به ازای همه شون یه پروسه ایجاد میکنه.دقیقا همون چیزی که ما میخوایم.)
بدین نحو:

String[] cmd = { "/bin/sh", "-c", "systemctl status tor.service | grep Active | cut -d' ' -f5" };
Process p = Runtime.getRuntime().exec(cmd);

و مسیله حل می شود.
ممنونم ازت محمد که سرنخو بهم دادی:)

آخرین ویرایش توسط LinArcX (2016-10-13 18:40:35)


"Enough!!!Don't Use "DEFAULTS" Any More..."make it simple stupid

آفلاین

پانوشت انجمن

پشتیبانی توسط تیم آرچ لینوکس ایران و نیرو گرفته با FluxBB