Đã có một câu trả lời đưa ra một đoạn mã được cải tiến cho nhiệm vụ mà các câu hỏi của người đăng ban đầu có liên quan đến, trong khi nó có thể chưa có câu trả lời trực tiếp hơn cho câu hỏi.
Câu hỏi là về sự khác biệt của
- A) Tạo nền cho "lệnh" trực tiếp, vs.
- B) Đặt một lớp con vào nền (nghĩa là với một tác vụ tương tự)
Hãy kiểm tra những khác biệt khi chạy 2 bài kiểm tra
# A) Backgrounding a command directly
sleep 2 & ps
đầu ra
[1] 4228
PID TTY TIME CMD
4216 pts/8 00:00:00 sh
4228 pts/8 00:00:00 sleep
trong khi
# A) backgrounding a subhell (with similar tas)
( sleep 2; ) & ps
xuất ra một cái gì đó như:
[1] 3252
PID TTY TIME CMD
3216 pts/8 00:00:00 sh
3252 pts/8 00:00:00 sh
3253 pts/8 00:00:00 ps
3254 pts/8 00:00:00 sleep
** Kết quả kiểm tra:**
Trong thử nghiệm này (chỉ chạy a sleep 2
) phiên bản subshell thực sự khác nhau, vì nó sẽ sử dụng 2 tiến trình con (tức là hai fork()
/ exec
hoạt động và PID) và do đó nhiều hơn so với nền tảng trực tiếp của lệnh.
Trong script 1
các câu hỏi tuy nhiên lệnh không phải là một đơn sleep 2s
nhưng thay vào đó là một pipe
trong 4 lệnh, mà nếu chúng ta thử nghiệm bên trong trường hợp thêm
- C) Tạo nền cho một đường ống với 4 lệnh
# C) Backgrounding a pipe with 4 commands
sleep 2s | sleep 2s | sleep 2s | sleep 2s & ps
mang lại điều này
[2] 3265
PID TTY TIME CMD
3216 pts/8 00:00:00 bash
3262 pts/8 00:00:00 sleep
3263 pts/8 00:00:00 sleep
3264 pts/8 00:00:00 sleep
3265 pts/8 00:00:00 sleep
3266 pts/8 00:00:00 ps
và cho thấy rằng thực sự script 1
sẽ là một chủng cao hơn nhiều về mặt PIDs
và fork()
s.
Theo ước tính sơ bộ, tập lệnh sẽ sử dụng khoảng 254 * 4 ~ = 1000 PID và do đó thậm chí còn nhiều hơn so script 2
với với 254 * 2 ~ = 500 PID. Bất kỳ vấn đề nào xảy ra do sự suy giảm của PID đều có vẻ khó xảy ra vì hầu hết các hộp Linux
$ cat /proc/sys/kernel/pid_max
32768
mang đến cho bạn 32x lần PID cần thiết ngay cả đối với trường hợp script 1
và các quá trình / chương trình liên quan (ví dụ sed
, ping
, vv) cũng dường như khó có thể gây ra những kết quả hay thay đổi.
Như người dùng @derobert đã đề cập, vấn đề thực sự đằng sau sự scripts
thất bại là việc thiếu wait
lệnh, có nghĩa là sau khi làm nền các lệnh trong vòng lặp kết thúc tập lệnh và do đó trình bao khiến tất cả các tiến trình con bị chấm dứt.
apt-get install fping
: - / (hoặcnmap -sP
)