Xử lý crash và tự khởi động lại cho job OpenClaw

Bạn chạy job OpenClaw trên VPS, ổn định vài ngày, rồi tự dưng thấy nó chết ngắc. Không log, không báo lỗi, chỉ là biến mất. Hoặc tệ hơn: nó chạy nhưng treo ở một bước nào đó, không crash, không tiến lên, ngốn RAM, hiếm khi finish. Làm automation mà phải canh manual thì phí. Bài này mình chỉ cách xử lý crash và treo cho job OpenClaw: systemd tự restart, Docker healthcheck, timeout phát hiện treo, và dọn zombie.
Yêu cầu trước khi bắt đầu
- VPS chạy Ubuntu 24.04 hoặc Debian 12, có quyền root hoặc sudo.
- OpenClaw đã cài và chạy được (trong Docker hoặc service systemd).
- Hiểu cơ bản systemd unit file và Docker Compose.
Vì sao job OpenClaw hay crash và treo?
OpenClaw là agent tự động hoá, nó tương tác với GUI, đọc JSON, gọi API. Nguyên nhân crash phổ biến: lỗi kết nối trình duyệt (Chrome/Puppeteer crash), hết RAM (OOM kill), bug trong skill script. Treo thường đến từ: vòng lặp vô hạn trong workflow, chờ response API timeout, hoặc xung đột thread. Hiểu nguyên nhân giúp bạn biết nên dùng restart (cho crash) hay timeout (cho treo).
Bước 1, Cấu hình systemd Restart=on-failure
Nếu bạn chạy OpenClaw như một systemd service, đây là cách đơn giản nhất để tự restart khi crash. Mở file unit (vd /etc/systemd/system/openclaw.service) và thêm:
[Unit]
Description=OpenClaw Agent
After=network.target
[Service]
Type=simple
ExecStart=/usr/local/bin/openclaw --config /etc/openclaw/config.json
Restart=on-failure
RestartSec=10
User=openclaw
Group=openclaw
[Install]
WantedBy=multi-user.target
Giải thích: Restart=on-failure, chỉ restart khi tiến trình thoát với mã lỗi (khác 0), không restart khi dừng manual. RestartSec=10, đợi 10 giây trước khi restart, tránh restart loop nếu lỗi xảy ra liên tục. Nếu crash liên tục, bạn cần check log trước (dùng journalctl -u openclaw) rồi sửa source, không để máy restart mãi. Sau khi sửa, reload và enable:
sudo systemctl daemon-reload
sudo systemctl enable openclaw
sudo systemctl restart openclaw
Bước 2, Phát hiện treo bằng timeout trong script
Treo khác crash: tiến trình vẫn sống (mã 0) nhưng không xử lý gì. Restart=on-failure không bắt được. Cần timeout. Cách đơn giản: chạy OpenClaw trong wrapper script có timeout từ bên ngoài.
Tạo file /usr/local/bin/openclaw-wrapper.sh:
#!/bin/bash
TIMEOUT=600 # 10 phút
while true; do
timeout $TIMEOUT /usr/local/bin/openclaw --config /etc/openclaw/config.json
EXIT_CODE=$?
if [ $EXIT_CODE -eq 124 ]; then
logger -t openclaw "Job bị timeout sau $TIMEOUT giây, restarting..."
elif [ $EXIT_CODE -ne 0 ]; then
logger -t openclaw "Job crash với mã $EXIT_CODE, restarting..."
fi
sleep 5
done
Giải thích: timeout 600, nếu OpenClaw không kết thúc sau 10 phút, nó gửi SIGTERM (mã 124). Vòng lặp while true khởi động lại. Điều chỉnh TIMEOUT theo thời gian chạy trung bình của job bạn. Sửa ExecStart trong unit systemd thành script này:
ExecStart=/usr/local/bin/openclaw-wrapper.sh
Verify: journalctl -t openclaw sẽ ghi log mỗi lần timeout.
Bước 3, Docker healthcheck cho OpenClaw
Nếu bạn chạy OpenClaw trong Docker (khuyên dùng vì cô lập môi trường), dùng healthcheck tự động kiểm tra và restart container. Ví dụ docker-compose.yml:
version: '3.8'
services:
openclaw:
image: openclaw/openclaw:latest
container_name: openclaw
restart: on-failure
healthcheck:
test: ["CMD", "pgrep", "-f", "openclaw"]
interval: 30s
timeout: 10s
retries: 3
start_period: 60s
volumes:
- ./config:/etc/openclaw
environment:
- TZ=Asia/Ho_Chi_Minh
Giải thích: pgrep -f openclaw kiểm tra tiến trình có chạy không. Nếu 3 lần liên tiếp (retries) không thấy, Docker đánh dấu container unhealthy và (với restart: on-failure) sẽ tự restart. start_period: 60s cho thời gian khởi động ban đầu, tránh restart sai. Healthcheck chỉ phát hiện crash, không phát hiện treo. Muốn bắt treo, dùng healthcheck phức tạp hơn:
test: ["CMD-SHELL", "pgrep -f openclaw && timeout 10 sh -c 'tail -n1 /var/log/openclaw/last_heartbeat 2>/dev/null | xargs -I{} bash -c \"[ $(date +%s) - {} -lt 120 ]\" && echo healthy || echo stale'"]
Cách này yêu cầu OpenClaw ghi timestamp vào file mỗi 60 giây. Nếu quá 120 giây không ghi, healthcheck fail. Nâng cao hơn, nhưng đáng đầu tư cho production.
Bước 4, Dọn tiến trình mồ côi (zombie)
Khi OpenClaw crash, con của nó (trình duyệt Chrome, các process con) có thể thành mồ côi, vẫn chạy, ngốn RAM và CPU, tích tụ lâu ngày làm máy chậm. Cấu hình KillMode=process trong systemd giúp dọn khi service stop, nhưng nếu restart nhanh, zombie có thể tồn tại.
Cách đánh dấu tiến trình con theo nhóm (cgroup) để khi service dừng, systemd kill cả nhóm:
[Service]
KillMode=control-group
KillSignal=SIGTERM
SendSIGKILL=yes
KillMode=control-group, mặc định của systemd, khi service stop, nó gửi SIGTERM/SIGKILL đến tất cả tiến trình trong cùng cgroup. Nếu bạn dùng KillMode=process, nó chỉ kill process chính, để zombie. Với Docker, thêm init: true trong docker-compose.yml, Docker sẽ chạy init process bên trong container, tự dọn zombie:
services:
openclaw:
image: openclaw/openclaw:latest
init: true
Nếu không dùng Docker, cài tini hoặc dùng systemd làm PID 1.
Cuối cùng, lệnh dump zombie để kiểm tra sau một thời gian chạy:
ps aux | grep -w Z | grep -v grep
echo "Kiểm tra: nếu có dòng Z (zombie), cần xử lý"
Không thấy zombie tức là đã dọn sạch.
Bước 5, Theo dõi và cảnh báo
Dù đã có restart tự động, bạn vẫn nên nhận cảnh báo khi crash xảy ra nhiều lần. Script nhỏ gắn vào systemd:
OnFailure=openclaw-failure@%n.service
Tạo unit /etc/systemd/system/[email protected]:
[Unit]
Description=OpenClaw failure alert for %i
[Service]
Type=oneshot
ExecStart=/usr/local/bin/openclaw-email-alert.sh %i
Script openclaw-email-alert.sh gửi email hoặc Telegram. Cách đơn giản hơn: dùng healthcheck của Docker trạng thái unhealthy gắn với webhook. Nếu chạy trên VPS OpenClaw của thueVPS, bạn có thể dùng snapshot để rollback nếu crash làm hỏng cấu hình.
Xử lý lỗi thường gặp
- Restart loop vô hạn: OpenClaw crash ngay khi khởi động → restart liên tục → ngốn log, ngốn CPU. Giải pháp: kiểm tra
journalctl -u openclaw --since "5 min ago"xem lỗi gì. Tạm thờisystemctl stop openclaw, sửa config, rồi start lại. - Timeout sai: Job chạy lâu hơn timeout bạn đặt (vd job mất 12 phút nhưng bạn chỉ 10) → bị kill oan. Giải: theo dõi thời gian chạy trung bình qua vài lần, đặt timeout = 1.5× hoặc 2×.
- Zombie vẫn tồn tại: Nếu không dùng
init: trueDocker hoặcKillMode=control-group, zombie tích tụ. Kiểm traps aux | grep -w Z. Giải: thêminit: truehoặc cài tini. - Healthcheck không chạy: Lỗi cú pháp trong
test:(thường do thiếu ngoặc). Kiểm tradocker container inspect openclaw | jq '.[].State.Health'xem status.
Câu hỏi thường gặp
Restart=on-failure có restart khi bị OOM kill không?
Có. Khi kernel OOM killer giết tiến trình OpenClaw, nó thoát với mã 9 (SIGKILL), systemd đọc mã đó là failure và tự động restart sau RestartSec. Bạn sẽ thấy log "openclaw.service: Main process exited, code=killed, status=9/KILL".
Nên đặt timeout bao nhiêu cho job OpenClaw?
Phụ thuộc vào task. Nếu job lấy dữ liệu từ API mất vài giây, đặt 60 giây. Nếu chạy workflow dài (đặt tour, so sánh giá 100 sản phẩm), có thể 30 phút. Theo dõi vài lần chạy đầu, lấy số trung bình nhân 1.5 đến 2, đó là timeout hợp lý.
Dùng Docker healthcheck hay systemd để restart?
Cả hai đều tốt. Docker healthcheck mạnh hơn vì kiểm tra được cả log heartbeat (phát hiện treo), nhưng phức tạp. Systemd đơn giản, dễ debug, phù hợp nếu bạn chạy OpenClaw ngoài Docker. Mình chọn Docker vì tích hợp init: true dọn zombie.
Zombie process có ảnh hưởng gì?
Zombie không ngốn CPU (chết rồi) nhưng chiếm entry trong bảng process, RAM nhỏ. Nhiều zombie (> hàng trăm) có thể làm hệ thống chậm, hết PID pool. Nếu thấy zombie, xử lý ngay.
Job treo do lỗi code OpenClaw, restart có giúp không?
Restart giúp chạy lại từ đầu, nhưng nếu lỗi code là lỗi logic (vd vòng lặp vô hạn trong skill script), restart chỉ delay thất bại. Bạn phải fix code, không thể restart mãi.
Có cần VPS cấu hình cao cho OpenClaw crash handling không?
Không. Xử lý crash và restart dùng ít tài nguyên, chỉ thêm vài KB cho healthcheck, vài MB cho log. Ngay cả gói VPS giá rẻ từ 189.000đ/tháng (1 vCPU, 2 GB RAM) cũng đủ chạy OpenClaw kèm các cơ chế này. Nếu bạn cần nhiều job song song, VPS Windows với RAM lớn hơn sẽ phù hợp hơn.
Bài viết liên quan
- OpenClaw là gì và chạy trên VPS cần cấu hình bao nhiêu
- Cài OpenClaw trên VPS Ubuntu từ đầu tới lần chạy đầu tiên
- Chọn RAM cho n8n theo số workflow chạy song song


