“&” Ở cuối một lệnh linux có nghĩa là gì?


91

Tôi là quản trị viên hệ thống và tôi đã được yêu cầu chạy một tập lệnh linux để làm sạch hệ thống.

Lệnh này là:

perl script.pl > output.log &

vậy lệnh này được kết thúc bằng một &dấu hiệu, có ý nghĩa đặc biệt nào của nó không?

Tôi có kiến ​​thức cơ bản về shell nhưng tôi chưa bao giờ thấy điều này trước đây.


xin lỗi xấu của tôi, tôi đã biết về những thứ cơ bản như
Dude

1
Nếu bạn đang ở trang này đang tìm kiếm sự khác biệt giữa &&&: &thực thi lệnh đầu tiên trong nền; &&thực hiện lệnh đầu tiên và có điều kiện chuyển sang lệnh thứ hai nếu nó thoát thành công.
David Bodow

Câu trả lời:


144

Làm &cho lệnh chạy ở chế độ nền.

Từ man bash:

Nếu một lệnh được kết thúc bởi toán tử điều khiển & , trình bao thực thi lệnh trong nền trong một vỏ con. Trình bao không đợi lệnh kết thúc và trạng thái trả về là 0.


12

Ngoài ra, bạn có thể sử dụng dấu "&" để chạy nhiều quy trình thông qua một (1) kết nối ssh nhằm duy trì số lượng thiết bị đầu cuối tối thiểu. Ví dụ: tôi có một quy trình lắng nghe thông báo để trích xuất tệp, quy trình thứ hai lắng nghe thông báo để tải tệp lên: Sử dụng "&", tôi có thể chạy cả hai dịch vụ trong một thiết bị đầu cuối, thông qua một kết nối ssh duy nhất tới máy chủ của mình .


***** Tôi vừa nhận ra rằng những tiến trình này chạy qua "&" cũng sẽ "tồn tại" sau khi phiên ssh đóng! khá gọn gàng và hữu ích nếu kết nối của bạn với máy chủ bị gián đoạn **


nohupcũng sẽ giữ cho các quy trình tồn tại.
Jerry Chin

2
với & chúng tôi có thể nhận được PID cũng vì vậy chúng ta có thể chấm dứt quá trình nếu chúng ta muốn và chúng tôi cũng có thể kiểm tra tình trạng của quá trình đó
Dhaval Solanki

12

Khi không được yêu cầu, các lệnh sẽ tiếp quản nền trước. Bạn chỉ có một tiến trình "nền trước" chạy trong một phiên trình bao. Biểu tượng & hướng dẫn các lệnh chạy trong một quy trình nền và ngay lập tức quay trở lại dòng lệnh cho các lệnh bổ sung.

sh my_script.sh &

Quá trình nền sẽ không tồn tại sau khi phiên trình bao đóng. SIGHUP chấm dứt tất cả các quy trình đang chạy. Theo mặc định. Nếu lệnh của bạn đang chạy lâu hoặc chạy vô thời hạn (ví dụ: microservice), bạn cần phải xử lý nó bằng nohup để nó vẫn chạy sau khi bạn ngắt kết nối khỏi phiên:

nohup sh my_script.sh &

CHỈNH SỬA: Dường như có một vùng màu xám liên quan đến việc đóng các quy trình nền khi & được sử dụng. Chỉ cần lưu ý rằng trình bao có thể đóng quá trình của bạn tùy thuộc vào hệ điều hành và cấu hình cục bộ của bạn (đặc biệt là trên CENTOS / RHEL): https://serverfault.com/a/117157 .


1

Tôi không biết chắc chắn nhưng tôi đang đọc một cuốn sách và những gì tôi nhận được là một chương trình cần phải xử lý tín hiệu của nó (như khi tôi nhấn CTRL-C). Bây giờ một chương trình có thể sử dụng SIG_IGNđể bỏ qua tất cả các tín hiệu hoặc SIG_DFLđể khôi phục hành động mặc định.

Bây giờ nếu bạn làm vậy $ command &thì quá trình này đang chạy dưới dạng quá trình nền chỉ đơn giản là bỏ qua tất cả các tín hiệu sẽ xảy ra. Đối với các quy trình tiền cảnh, những tín hiệu này không bị bỏ qua.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.