Gateway
Kunci Gateway
Mengapa
- Hanya satu proses Gateway yang boleh memiliki konfigurasi + port tertentu pada sebuah host; jalankan Gateway tambahan dengan profil terisolasi dan port unik.
- Tetap berfungsi setelah crash/SIGKILL tanpa meninggalkan berkas kunci usang.
- Segera gagal dengan galat yang jelas ketika Gateway lain sudah memiliki port tersebut.
Dua lapisan
Saat dimulai, kepemilikan instans tunggal diberlakukan melalui dua langkah independen, secara berurutan:
- Kunci berkas memperoleh berkas kunci per konfigurasi di dalam direktori kunci status. Sebagai bagian dari proses memperolehnya, saat dimulai sistem memeriksa port yang dikonfigurasi untuk menemukan listener aktif guna mendeteksi pemilik kunci usang (yang mengalami crash).
- Pengikatan soket mengikat listener HTTP/WebSocket (bawaan
ws://127.0.0.1:18789) sebagai listener TCP eksklusif.
Setiap lapisan dapat gagal secara independen dan melempar GatewayLockError masing-masing.
Kunci berkas
-
Jika berkas kunci tidak ada, proses pemilik yang tercatat sudah berhenti, atau pemeriksaan port pemilik menunjukkan tidak ada listener aktif, saat dimulai sistem mengambil alih kunci dan melanjutkan.
-
Jika kunci sedang dipegang secara aktif dan tidak satu pun kondisi di atas berlaku, saat dimulai sistem mencoba ulang hingga 5 detik (bawaan) sebelum menyerah:
text GatewayLockError("gateway already running (pid <pid>); lock timeout after <ms>ms")
Pengikatan soket
-
Saat terjadi
EADDRINUSE, saat dimulai sistem mencoba ulang pengikatan hingga 20 kali dengan interval 500 md (total sekitar 10 detik) agar dapat melewati jendelaTIME_WAITsetelah proses baru saja berhenti. -
Jika port masih digunakan setelah percobaan ulang:
text GatewayLockError("another gateway instance is already listening on ws://127.0.0.1:<port>") -
Kegagalan pengikatan lainnya:
text GatewayLockError("failed to bind gateway socket on ws://127.0.0.1:<port>: <cause>")
Saat dimatikan, Gateway menutup server HTTP/WebSocket dan menghapus berkas kunci.
Catatan operasional
- Jika port ditempati oleh proses lain yang bukan Gateway, galatnya sama; kosongkan port tersebut atau pilih port lain dengan
openclaw gateway --port <port>. - Di bawah pengawas layanan, proses Gateway baru yang mengalami salah satu galat di atas terlebih dahulu memeriksa
/healthzpada proses yang sudah ada. Jika proses tersebut sehat, proses baru membiarkannya tetap memegang kendali alih-alih gagal. Pada systemd, proses keluar dengan kode78;RestartPreventExitStatus=78pada unit mencegahRestart=alwaysterus berulang akibat konflik kunci atauEADDRINUSE. Jika proses yang sudah ada tidak pernah menjadi sehat, percobaan ulang pemeriksaan kesehatan dibatasi waktu, lalu proses awal gagal dengan galat kunci di atas alih-alih berulang tanpa batas. - Aplikasi macOS mempertahankan pengaman PID ringannya sendiri sebelum menjalankan Gateway; kunci berkas dan pengikatan soket di atas merupakan mekanisme penegakan runtime yang sebenarnya.
Terkait
- Beberapa Gateway - menjalankan beberapa instans dengan port unik
- Pemecahan masalah - mendiagnosis
EADDRINUSEdan konflik port