Computer >> Hướng Dẫn Máy Tính >  >> Điện Thoại Thông Minh >> Linux

Cách chạy tiến trình nền (background) không bị ngắt khi thoát SSH với nohup

Hướng dẫn dùng nohup (no hangup) chạy lệnh/script tiếp tục sau khi đóng terminal/SSH – thiết yếu cho tác vụ chạy dài (backup, restore DB, training ML...).

Cú pháp cơ bản

# nohup command [args] &
  • nohup: Bỏ qua signal SIGHUP (gửi khi terminal đóng).
  • &: Chạy background (job control shell).
  • Output stdout/stderr mặc định ghi vào nohup.out (thư mục hiện tại).

Ví dụ: Backup MySQL lớn qua SSH

# ssh user@server
# nohup mysqldump -u user -p'pass' large_db > large_db.sql 2>&1 &
[1] 3999
nohup: appending output to 'nohup.out'
  • 2>&1: Gộp stderr vào stdout → cùng ghi vào nohup.out.
  • 3999: PID của tiến trình.

Kiểm tra tiến trình

# ps -ef | grep 3999
# jobs -l          # Xem job shell hiện tại
# tail -f nohup.out  # Theo dõi output real-time

Khi tiến trình kết thúc

[1]+  Done  nohup mysqldump ...

Kiểm tra nohup.out để xem lỗi (nếu có).

Tùy chỉnh file output

# nohup command > mylog.log 2>&1 &
# nohup command >> append.log 2>&1 &

So sánh: nohup vs disown vs screen/tmux vs systemd

Công cụPhù hợpƯu điểmNhược điểm
nohupCommand/script đơn lẻ, ngắn hạnĐơn giản, có sẵn, giữ outputKhông tương tác lại được, khó quản lý nhiều job
disown -h %1Đã chạy, muốn tách khỏi shellKhông cần khởi động lạiChỉ tác động job hiện tại shell
screenPhiên tương tác, nhiều cửa sổAttach/detach, scrollback, multi-windowCần cài, nhẹ hơn tmux
tmuxPhiên tương tác chuyên nghiệpPane, session persist, scriptable, pluginHọc curve cao hơn screen
systemd serviceService chạy dài, productionAuto-start, restart, logging, dependency, securityCần cấu hình unit file, quyền root

Best Practice cho Server Production

  1. Tác vụ một lần (backup, migrate): nohup hoặc screen/tmux.
  2. Tác vụ lặp lại (cron, worker): systemd timer/service hoặc cron.
  3. Luôn redirect output: > logfile 2>&1.
  4. Dùng PID file + lock: Tránh chạy trùng.
  5. Thông báo khi xong: Thêm ; echo "Done" | mail -s "Job done" admin@domain.com vào cuối command.

Ví dụ hoàn chỉnh an toàn

nohup bash -c 'mysqldump -u$USER -p"$PASS" db > backup_$(date +%F).sql 2>&1; echo "Backup done" | mail -s "DB Backup" admin@example.com' > backup.log 2>&1 &