Tôi thường sử dụng bash
các kịch bản shell để chạy các lệnh đơn giản cho nhiều tệp khác nhau. Ví dụ, giả sử rằng tôi có sau bash
shell script, được gọi là script.sh
, chạy chương trình / command foo
vào ba tập tin văn bản "a.txt"
, "b.txt"
, "c.txt"
:
#!/bin/bash
for strname in "a" "b" "c"
do
foo $strname".txt"
done
Ngoài ra, giả sử foo $strname".txt"
là chậm, vì vậy việc thực thi tập lệnh sẽ mất nhiều thời gian (ví dụ như giờ hoặc ngày). Vì điều này, tôi muốn sử dụng nohup
để việc thực thi tiếp tục ngay cả khi thiết bị đầu cuối bị đóng hoặc ngắt kết nối. Tôi cũng muốn kịch bản ngay lập tức đi đến nền, vì vậy tôi sẽ sử dụng &
toán tử. Vì vậy, tôi sẽ sử dụng lệnh sau để gọi script.sh
:
nohup bash script.sh &
Điều này hoạt động tốt để chạy tập lệnh ở chế độ nền và không bị treo máy, nhưng bây giờ giả sử rằng tôi muốn chấm dứt thực thi tại một số điểm vì một số lý do. Tôi có thể làm cái này như thế nào?
Vấn đề mà tôi gặp phải là, bằng cách nhìn vào top
, tôi chỉ thấy foo
tương ứng với "a.txt"
. Tôi có thể chấm dứt foo
cuộc gọi đó , nhưng sau đó foo
tương ứng để "b.txt"
được gọi và sau đó tôi cũng phải chấm dứt cuộc gọi đó , v.v. Đối với hàng chục hoặc hàng trăm tệp văn bản được chỉ định trong for
vòng lặp, việc chấm dứt từng cái một sẽ trở thành một nỗi đau foo
! Vì vậy, bằng cách nào đó tôi cần phải thay vì chấm dứt shell script tự , không phải là đặc biệt các cuộc gọi ban hành từ các tập lệnh shell.
Khi tôi gõ lệnh
ps -u myusername
nơi myusername
là tên người dùng của tôi, tôi nhận được một danh sách các tiến trình mà tôi đang chạy. Nhưng tôi thấy hai ID tiến trình khác nhau được gọi bash
. Làm thế nào để tôi biết quá trình nào trong số này, nếu có, tương ứng với cuộc gọi ban đầu của tôi nohup bash script.sh &
?
for s in a b c; do foo "$s".txt; done
nohup
sẽ mất rất lâu khi bạn đưa ra một danh sách quy trình để xem công việc bạn đã bắt đầu. Bạn có thể nhìn vào cột "tính độc đáo" trong ps
đầu ra nhưng câu trả lời ở đây hữu ích hơn.