Viết một tập tin thủ công từ tập lệnh Bash


10

Làm thế nào tôi có thể viết một Bash-script chạy một chương trình chạy dài và lưu trữ id tiến trình chương trình trong một tệp riêng biệt?

Tôi muốn một cái gì đó như

#!/bin/bash
exec long_running_tool
echo `ps af |grep "long_running_tool" |awk '$5 == "long_running_tool" {print $1}'` > pid_file

Tuy nhiên, làm chính xác điều này sẽ thực thi công cụps sau khi kết thúc.

Có cách nào để lấy id quá trình của quá trình được tạo không?


2
Mã mẫu của bạn sẽ không hoạt động vì exec không fork, vì vậy quy trình shell được thay thế bởi long_running_toolquy trình. Do đó, exec không bao giờ quay trở lại và dòng sau không bao giờ đạt được. Xem help exec, execve(2).
Etienne Dechamp

@ e-t172 cảm ơn bạn đã chỉ ra. Tôi xóa 'exec' rồi.
DerMike

Câu trả lời:


12

Bạn có thể dễ dàng chạy quy trình trong nền bằng "&", sau đó lấy PID của quy trình nền bằng cách sử dụng "$!"

#!/bin/bash
long_running_tool &
echo $! > pid_file

Sau đó, tùy chọn, chờ $! nếu bạn muốn shell chặn cho đến khi quá trình hoàn thành thực thi.


1
CẬP NHẬT: khi tôi sử dụng fg, tôi nhận được 'fg: 21: job (null) không được tạo dưới sự kiểm soát công việc' và tập lệnh không bị chặn. Lấy làm tiếc.
DerMike

"đợi $!" nên có một hiệu ứng tương tự như fg mà tôi có thể xác nhận trên thực tế, hoạt động theo một kịch bản. Tôi có lẽ nên kiểm tra điều đó trước khi đăng. >.> xấu của tôi.
Jeremy Sturdivant

9
#!/bin/bash
echo $$ > fooapp.pid
exec fooapp

Như đã đề cập trước đó, exec thay thế bash bằng chương trình đã chỉ định, giữ lại PID.

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.