2013-08-08 59 views
9

Tôi đã tự hỏi nếu có một số cách để buộc phải sử dụng một số ID quá trình cụ thể để Linux để một số ứng dụng trước khi chạy nó. Tôi cần phải biết trước ID quá trình.Làm thế nào để thiết lập ID quá trình trong Linux cho một chương trình cụ thể

Cảm ơn

+2

Mùi giống như vấn đề XY. Tại sao bạn cần pid trước? –

+0

Từ những gì tôi biết về Linux và Unices nói chung, tôi sẽ ngạc nhiên nếu bạn có thể làm điều đó, nhưng có rất nhiều cách để tìm ra PID của một quá trình cho trước khi nó đang chạy. Có lẽ bạn nên giải thích những gì bạn muốn làm và đưa ra đề xuất về lựa chọn thay thế. – deStrangis

+2

Câu trả lời ngắn gọn là không. – devnull

Trả lời

14

Trên thực tế, có một cách để làm điều này. Kể từ hạt nhân 3.3 với CONFIG_CHECKPOINT_RESTORE thiết lập (được đặt trong hầu hết các bản phân phối), có/proc/sys/kernel/ns_last_pid chứa pid cuối cùng được tạo ra bởi hạt nhân. Vì vậy, nếu bạn muốn thiết lập PID cho chương trình chia hai, bạn cần phải thực hiện những hành động này:

  1. Mở/proc/sys/kernel/ns_last_pid và nhận fd
  2. bầy nó với LOCK_EX
  3. ghi PID- 1
  4. ngã ba

Voilà! Trẻ sẽ có PID mà bạn muốn. Ngoài ra, đừng quên mở khóa (đổ bằng LOCK_UN) và đóng ns_last_pid.

Bạn có thể kiểm tra mã C tại blog của mình here.

+0

mã c là một phần của dự án criu. Và tệp/proc/sys/kernel/ns_last_pid không tồn tại trong tất cả các hệ thống. Vì vậy, mã không hoạt động trên ubuntu. Có cách nào tôi canmake nó làm việc trên ubuntu? – hebbo

+0

@hebbo Mã nên hoạt động trên ubuntu gần đây. Thử nghiệm trên 14.04 và 14.10. –

+0

Tôi thích ý tưởng, nhưng đây là một hack khủng khiếp trong hầu hết các tình huống thực tế. :-D –

1

Mỗi quá trình trên một hệ thống Linux được tạo ra bởi fork() do đó nên không có cách nào để buộc một PID cụ thể.

+0

Ngoại trừ một vài tiến trình kỳ diệu được khởi động bởi hạt nhân: '/ sbin/init' và có lẽ '/ sbin/modprobe' etc ... (chưa kể' vfork' là biến thể của 'fork') –

3

Như nhiều người đã đề xuất bạn không thể đặt trực tiếp một PID nhưng thường vỏ có cơ sở để biết đó là ID quá trình được chia rẽ cuối cùng.

Ví dụ: trong bash bạn có thể ăn trưa một tập tin thực thi ở chế độ nền (thêm &) và tìm PID của nó trong biến $!. Ví dụ:

$ lsof >/dev/null & 
[1] 15458 
$ echo $! 
15458 
2

Không có cách nào để buộc sử dụng PID cụ thể cho quy trình. Như Wikipedia nói: ID

Process thường được phân bổ trên cơ sở liên tục, bắt đầu từ 0 và tăng lên một giá trị lớn nhất mà thay đổi từ hệ thống để hệ thống. Sau khi đạt đến giới hạn này, phân bổ khởi động lại ở mức 300 và một lần nữa, số lần tăng là . Trong Mac OS X và HP-UX, khởi động lại phân bổ ở 100. Tuy nhiên, cho điều này và sau đó đi qua bất kỳ PID vẫn gán cho quá trình được bỏ qua

+0

Cảm ơn câu trả lời hữu ích.Thing là tôi đã cố gắng để tạo ra một số gói tin ICMP trả lời dựa trên quá trình ID, cho điều này tôi cần một số checksum dựa trên PID từ quá trình ban đầu. Vì vậy, đó là lý do tại sao tôi thực sự biết trước PID này để tạo ra checksum đúng. Nó có nghĩa là, tôi nên xây dựng các gói tin dựa trên yêu cầu trong thời gian thực. Nhưng điều này sẽ dễ dàng hơn nhiều và có thể chuẩn bị trước nếu tôi biết PID. Tôi giả định tùy chọn duy nhất là để hack/sửa đổi nguồn linux để cho PID cụ thể trong một số trường hợp cụ thể. –

+0

Bạn có thể bắt đầu một số quy trình trước tại thời điểm khởi động, và làm cho chúng 'execve' sau đó chương trình thích hợp (sau khi đã đăng ký pid của họ ở một số nơi nổi tiếng). Tôi chắc chắn sẽ tránh hack hạt nhân cho việc này. –

+0

Cảm ơn, cuối cùng tôi sẽ tạo ra các phản ứng gói tin trong thời gian thực dựa trên gói dữ liệu đầu vào. Vì vậy, tôi đã kiểm tra dựa trên quá trình ID trích xuất từ ​​gói tin ban đầu và cho một số chậm trễ cho các ứng dụng khách hàng để có thời gian để xây dựng các gói tin và trả lời. Điều này làm việc hoàn hảo với tôi bây giờ, vì vậy không có bất kỳ hack cần thiết cuối cùng. –