Gateway
قفل Gateway
چرا
- تنها یک فرایند Gateway باید مالک یک دایرکتوری وضعیت باشد؛ Gatewayهای اضافی را با پروفایلها، دایرکتوریهای وضعیت، پیکربندیها و پورتهای مجزا اجرا کنید.
- بدون باقیگذاشتن فایلهای قفل منقضیشده، از خرابیها/SIGKILL جان سالم بهدر ببرد.
- وقتی Gateway دیگری از قبل مالک پورت است، با خطایی روشن و سریع متوقف شود.
سه لایه
راهاندازی، مالکیت را در سه مرحله و بهترتیب اعمال میکند:
- قفل مالکیت وضعیت قفلی را بر اساس دایرکتوری وضعیت متعارف بهدست میآورد. همه Gatewayها، از جمله Gatewayهایی که با
OPENCLAW_ALLOW_MULTI_GATEWAY=1راهاندازی شدهاند، در آن مشارکت دارند تا نگهداری مخرب SQLite نتواند با یک مالک فعال تداخل پیدا کند. - قفل پیکربندی قفل قدیمی مختص هر پیکربندی را بهدست میآورد و پورت زمان اجرا را ثبت میکند. حالت چند-Gateway این تکنمونهایبودن پیکربندی را نادیده میگیرد، اما قفل مالکیت وضعیت را حفظ میکند.
- اتصال سوکت شنونده HTTP/WebSocket (بهطور پیشفرض
ws://127.0.0.1:18789) را بهعنوان یک شنونده TCP انحصاری متصل میکند.
هر لایه میتواند مستقل از بقیه ناموفق شود و GatewayLockError مختص خود را ایجاد کند.
قفلهای وضعیت و پیکربندی
-
فعالبودن قفل از PID ثبتشده، شناسه زمان شروع فرایند در پلتفرم در صورت دسترسبودن، و شناسه فرایند Gateway تعیین میشود. مالک تأییدشده در طول راهاندازی و پیش از شروع شنود پورتش، همچنان مرجع معتبر باقی میماند.
-
یک هماهنگکننده اختصاصی SQLite، بازرسی فراداده، بازپسگیری مالک منقضیشده و جایگزینی قفل را بهصورت سریالی انجام میدهد. اگر فرایند مالک از کار بیفتد، تراکنش انحصاری آن بهطور خودکار آزاد میشود.
-
اگر فایل قفل موجود نباشد یا فرایند مالک ثبتشده دیگر در حال اجرا نباشد، راهاندازی قفل را بازپس میگیرد و ادامه میدهد.
-
اگر هرکدام از قفلها فعالانه نگه داشته شده باشد، راهاندازی پیش از صرفنظرکردن تا 5 ثانیه (پیشفرض) دوباره تلاش میکند:
text GatewayLockError("Gateway از قبل در حال اجرا است (pid <pid>)؛ مهلت قفل پس از <ms>ms پایان یافت")
اتصال سوکت
-
در
EADDRINUSE، راهاندازی برای عبور از بازهTIME_WAITپس از خروج اخیر یک فرایند، اتصال را حداکثر 20 بار با فاصلههای 500ms دوباره امتحان میکند (در مجموع حدود 10 ثانیه). -
اگر پورت پس از تلاشهای مجدد همچنان در حال استفاده باشد:
text GatewayLockError("نمونه دیگری از Gateway از قبل در ws://127.0.0.1:<port> در حال شنود است") -
سایر خطاهای اتصال:
text GatewayLockError("اتصال سوکت Gateway در ws://127.0.0.1:<port> ناموفق بود: <cause>")
هنگام خاموششدن، Gateway سرور HTTP/WebSocket را میبندد و فایلهای قفل وضعیت و پیکربندی خود را حذف میکند.
نکات عملیاتی
- اگر پورت در اشغال فرایند دیگری غیر از Gateway باشد، خطا یکسان است؛ پورت را آزاد کنید یا با
openclaw gateway --port <port>پورت دیگری انتخاب کنید. OPENCLAW_ALLOW_MULTI_GATEWAY=1چندین نمونه پیکربندی/زمان اجرا را مجاز میکند، نه وضعیت تغییرپذیر مشترک را. هر نمونه همچنان به یکOPENCLAW_STATE_DIRمنحصربهفرد نیاز دارد.- زیر نظر یک سرپرست سرویس، فرایند جدید Gateway که با یکی از خطاهای بالا مواجه میشود، ابتدا
/healthzرا در فرایند موجود بررسی میکند. اگر آن فرایند سالم باشد، فرایند جدید بهجای ناموفقشدن، کنترل را در اختیار آن باقی میگذارد. در systemd، با کد78خارج میشود؛RestartPreventExitStatus=78واحد مانع از آن میشود کهRestart=alwaysبر اثر تداخل قفل یاEADDRINUSEوارد حلقه شود. اگر فرایند موجود هیچگاه سالم نشود، تلاش مجدد برای بررسی سلامت محدود به زمان است و سپس راهاندازی بهجای ورود به حلقهای بیپایان، با خطای قفل بالا ناموفق میشود. - برنامه macOS پیش از ایجاد Gateway، محافظ سبک PID خود را نگه میدارد؛ فایل قفل و اتصال سوکت بالا سازوکارهای واقعی اعمال محدودیت در زمان اجرا هستند.
مرتبط
- چندین Gateway - اجرای چندین نمونه با پورتهای منحصربهفرد
- عیبیابی - تشخیص
EADDRINUSEو تداخلهای پورت