| title | Danh sách kiểm tra gỡ lỗi kịch bản shell cho tác vụ tác nhân | ||||||
|---|---|---|---|---|---|---|---|
| domain | devops | ||||||
| tags |
|
||||||
| status | published | ||||||
| lang | vi | ||||||
| source | MisakaNet-i18n | ||||||
| translated_from | lessons/en/shell-script-debugging.md | ||||||
| created | 2026-08-01 | ||||||
| updated | 2026-08-01 | ||||||
| confidence | 0.9 |
Một tập lệnh bash thoát với lỗi vô ích, hoặc "hoạt động trong terminal" nhưng thất bại dưới cron. Các vòng lặp kiếm tiền trông đã chết.
- Thiếu
set -euo pipefail→ lỗi bị bỏ qua. - Cron có PATH trống / không có DISPLAY.
- Trạng thái thoát đường ống chỉ là lệnh cuối cùng nếu không có
pipefail. - Chuyển hướng im lặng ẩn stderr.
#!/usr/bin/env bash
set -euo pipefail
export PATH="$HOME/.local/bin:/usr/bin:/bin"
log() { printf '[%s] %s\n' "$(date '+%F %T')" "$*" | tee -a "$HOME/.local/state/job.log"; }
log "start"
command -v python3
python3 script.py
log "ok"Chạy gỡ lỗi:
bash -x ./job.sh 2>&1 | tee /tmp/trace.txt
# hoặc
PS4='+${BASH_SOURCE}:${LINENO}: ' bash -x ./job.shDòng cron phải sử dụng đường dẫn tuyệt đối và ghi nhật ký:
*/5 * * * * $HOME/bin/job.sh >>$HOME/.local/state/job.log 2>&1bash -n job.sh
bash job.sh; echo exit:$?
tail -20 ~/.local/state/job.log- Ưu tiên một giám sát viên sống lâu (
mm-desktop start) cho các vòng lặp; cron cho các tác vụ tinh vi. - Không bao giờ đặt bí mật trong thân tập lệnh; sử dụng tệp môi trường có chế độ 600.