آموزش اسکریپت نویسی

آموزش اسکریپت نویسی پوسته گنو-لینوکس

آموزش اسکریپت نویسی

آموزش اسکریپت نویسی پوسته گنو-لینوکس

پرسش و پاسخ شماره ۶۳

پرسش و پاسخ شماره ۶۳

وقتی من می‌خواهم بعد از اجرای یک job پس‌زمینه‌ای راه دور قطع ارتباط کنم، سرویس‌گیرنده ssh من هنگ می‌کند !

کُد زیر آنچه را انتظار دارید، انجام نخواهد داد:

   ssh me@remotehost 'sleep 120 &'
   # Client hangs for 120 seconds

این ویژگی OpenSSH می‌باشد. سرویس‌گیرنده تا وقتی که ترمینال راه دور هنوز در حال استفاده است، ارتباط را قطع نمی‌کند -- و در حالت ‎sleep 120 &‎، بازهم stdout و stderr به ترمینال متصل هستند.

پاسخ بی‌درنگ به این پرسش شما -- «چگونه می‌توانم ارتباط سرویس گیرنده را قطع کنم به طوری که اعلان پوسته را پس بگیرم؟» -- kill کردن سرویس گیرنده ssh است. البته می‌توانید این کار را با فرمانهای kill یا pkill، یا با ارسال سیگنال INT (معمولاً‎ Ctrl-C ‎) برای یک نشست ssh غیرمحاوره‌ای(مانند بالا)، یا برای پوسته محاوره‌ای راه دور با فشردن کلیدهای ‎ <Enter><~><.>‎ (اینتر، مد، نقطه) در پنجره ترمینال سرویس گیرنده، انجام بدهید.

چاره‌جویی طولانی‌تر این مورد، تأمین نمودن آنست که در طرف راه دور تمام توصیف‌گرهای فایل به فایل ثبت وقایع (یا به ‎/dev/null‎) تغییر مسیر داده شوند:

   ssh me@remotehost 'sleep 120 >/dev/null 2>&1 &'
   # فوراً باز می‌گردد

همچنین این مورد در برخی سیستم‌های یونیکسی قدیمی سرویسهای کمکی (daemon) را دوباره راه‌اندازی می‌کند.

   ssh root@hp-ux-box             # پوسته محاوره‌ای‎
   ...                            # روشن می‌کند که مشکل در سیستم‌فایل شبکه است‎
   /sbin/init.d/nfs.client stop   # با این اسکریپت مدیریت می‌شود و autofs 
   /sbin/init.d/nfs.client start  # قبول است (برخلاف لینوکس )‏ HP-UX کشتن آن در
   exit
   # آنرا بکُشید Enter ~ . سرویس گیرنده هنگ می‌کند با استفاده از 

لطفاً توجه نمایید که تحت SSH اجازه دادن به root برای ایجاد فایل ثبت رخداد، از نظر امنیتی، عادت بسیار بدی است. اگر شما باید این کار را انجام بدهید، پس یک اسکریپت منفرد ایجاد کنید که تمام دستورهای مورد نظر شما را بدون هیچ گزینه خط فرمان اجرا کند، و سپس فایل sudoers را طوری پیکربندی کنید که به یک کاربر مناسب بدون نیاز به کلمه عبور اجازه اجرای اسکریپت اشاره شده را بدهد. این کار متضمن آن خواهد بود که شما آگاه باشید چه فرمانهایی لازم است به طور مرتب اجرا بشوند و در صورتی که حساب کاربری مقرر در خطر فاش شدن قرار گیرد، خسارتی که می‌تواند وارد شود، محدود می‌گردد.

اسکریپت ‎/sbin/init.d/nfs.client‎ میراث یونیکس، سرویس‌های کمکی را در پس‌زمینه اجرا می‌کند اما اجازه می‌دهد stdout و stderr آنها به ترمینال متصل شوند(و آنها به طور کامل self-daemonize نیستند). راه حل آن یا تعمیر اسکریپت ناقص init فروشنده یونیکس، یاکُشتن پردازش سرویس گیرنده ssh پس از وقوع این مورد است. مؤلف این گفتار از رویکرد اخیر استفاده می‌کند.


پرسش و پاسخ 63 (آخرین ویرایش ‎2011-08-05 18:02:00‎ توسط GreyCat)