Chấm dứt tập lệnh bash shell đang chạy trong nền


16

Tôi thường sử dụng bashcá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 bashshell script, được gọi là script.sh, chạy chương trình / command foovà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 footương ứng với "a.txt". Tôi có thể chấm dứt foocuộc gọi đó , nhưng sau đó footươ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 forvò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 myusernamelà 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 &?


@Andrew, Cả hai quá trình có hiển thị nohup được đề cập trong lệnh không? .... thay vào đó, bạn có thể thử ps -aWu Andrew và kiểm tra xem bạn có nhận được một mục nhập dài duy nhất với nohup không .... nó có giúp ích không?
nitin

2
Như một bên, trích dẫn của bạn là lập dị. for s in a b c; do foo "$s".txt; done
tripleee

1
@NSD: Không, nohupsẽ 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.
tripleee

Câu trả lời:


9

Theo mặc định, pssẽ không hiển thị các tham số mà chương trình được gọi với. Các tùy chọn -f-lcả hai sẽ hiển thị cuộc gọi đầy đủ.

ps -fu username

sẽ dẫn đến kết quả đầu ra trông như:

username 23464 66.7  0.0  11400   628 pts/5    R    15:28   1:40 bash script.sh

2
Điều đó rất hữu ích, nhưng không phân tán nhiều quy trình với cùng một đối số.
tripleee

11

Bạn có một cặp đôi tùy chọn. Vì quá trình của bạn đang chạy trong nền, bạn có thể sử dụng jobsđể tìm nó:

nohup bash script.sh &
...
jobs
[1]+ Running    nohup bash script.sh &
kill %1
jobs
[1]+ Terminated nohup bash script.sh &

Bạn cũng có thể sử dụng pkillđể tìm kiếm bảng quy trình cho khớp dòng lệnh; viz:

pkill -f script.sh

1

Đầu psra (ví dụ ps aux) bao gồm ID tiến trình của cha mẹ. Giết cha mẹ bash, và con cái của nó, cũng sẽ bị chấm dứt.

Để trực quan hóa ASCII của cây quy trình, hãy thử pstree -pvới một vài quy trình nền đang chạy.

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.