2011-04-24 34 views
5

My Makefile giống như thế này:Bắt quá trình cuối cùng PID trong Makefile

setsid ./CppServer>daemon.log 2>&1 & 
echo $!>daemon.pid 

Những gì tôi mong đợi nó làm là để lưu trữ các PID của my_awesome_script trong tập tin tương ứng. Tuy nhiên không có gì ở đó cả. Vậy đâu là vấn đề?

Trả lời

4

Nếu makefile của bạn thực sự trông như thế này, bạn sẽ gặp lỗi, vì tôi không thấy cú pháp thực tế, chỉ cú pháp trình bao. Tuy nhiên, quả cầu pha lê của tôi nói với tôi rằng hai dòng này có thể là một phần của công thức cho một quy tắc. Nếu có, bạn nên nhận ra cách thực hiện công thức nấu ăn; đối với mỗi dòng, một subshell riêng biệt được tạo ra, trong đó dòng lệnh được thực hiện độc lập: hai lệnh của bạn không biết gì về môi trường của nhau. Nếu bạn muốn hai lệnh được thực hiện trong cùng một vỏ bọc, bạn nên phát hành chúng dưới dạng một dòng (sử dụng các ký tự tiếp tục dòng nếu cần) hoặc sử dụng chỉ thị ONESHELL của make.

+1

Điều đó không hữu ích. Cho tôi biết: tại sao là $! trống khi được hỏi trong Makefiles? – nalply

+2

@nalply: Nó trống vì không xác định biến với tên đó. Nếu bạn muốn sử dụng nó trong trình bao, bạn phải thoát khỏi ký hiệu đô la: '$$!', Nhưng bạn phải nhận thức được nhận xét của tôi về việc phát hành các lệnh trên một dòng, cách nhau bằng ví dụ: dấu chấm phẩy. – eriktous

+0

@eriktous câu trả lời tuyệt vời, chắc chắn hữu ích. Tôi đã có vấn đề nalply tiếp theo, tất nhiên là $$! giải quyết điều đó. – David

0

Biến bạn đang cố gắng sử dụng in dấu pid của chương trình cuối cùng chạy dưới nền. Nó được viết chính xác như echo $! > filename.extension. Nhưng kể từ khi bạn đang chạy nó trong foregorund bạn có hai lựa chọn. Chạy nó ở chế độ nền bằng cách nối thêm & vào cuối dòng ./script_to_run & hoặc bạn có thể tự in tập lệnh để ghi pid của quy trình hiện đang chạy bằng cách sử dụng echo $$> filename.extension (bên trong tập lệnh). Đây là liên kết có thể giúp bạn http://tldp.org/LDP/abs/html/internalvariables.html

+0

Không cần phải thêm thêm $ vào trước các biến nội bộ. – rubixibuc

+0

Tôi xin lỗi, nội dung của Makefile mà tôi cung cấp trong câu hỏi không giống như trong Makefile thực tế (tôi đã chạy kịch bản trong nền). Bây giờ nó là mặc dù. – Alex

+0

Tôi đang chạy một chương trình, không phải là một tập lệnh và tôi đang phụ thêm & vào lời gọi. Nhưng $! vẫn còn trống. Thế bây giờ thì thế nào? :-) – nalply

Các vấn đề liên quan