2010-01-02 20 views
7

Tôi đang cố gắng thiết lập máy chủ để kiểm tra tích hợp (thông số kỹ thuật thực) qua ruby ​​và không thể tìm ra cách kiểm soát quá trình.cách điều khiển (start/kill) một quá trình nền (ứng dụng máy chủ) trong ruby ​​

như vậy, những gì tôi đang cố gắng làm là:

  1. chạy một nhiệm vụ cào cho đá quý của tôi rằng thực hiện các kỹ thuật tích hợp
  2. nhiệm vụ cần phải đầu tiên bắt đầu một máy chủ (tôi sử dụng webrick) và sau đó chạy các thông số kỹ thuật
  3. sau khi thực hiện các thông số kỹ thuật cần giết webrick vì vậy tôi không trái với một số quá trình nền không sử dụng

webrick không phải là một yêu cầu, nhưng nó bao gồm trong ruby ​​chuẩn libra ry để có thể sử dụng nó sẽ là tuyệt vời.

hy vọng mọi người đều có thể trợ giúp!

ps. Tôi đang chạy trên Linux, do đó, có công việc này cho các cửa sổ không phải là ưu tiên chính của tôi (ngay bây giờ).

Trả lời

12

Cách tiêu chuẩn là sử dụng chức năng hệ thống (để sao chép quy trình hiện tại), exec (để thay thế quy trình hiện tại bằng tệp thi hành) và hủy (để gửi tín hiệu đến quá trình chấm dứt nó).

Ví dụ:

pid = fork do 
    # this code is run in the child process 
    # you can do anything here, like changing current directory or reopening STDOUT 
    exec "/path/to/executable" 
end 

# this code is run in the parent process 
# do your stuffs 

# kill it (other signals than TERM may be used, depending on the program you want 
# to kill. The signal KILL will always work but the process won't be allowed 
# to cleanup anything) 
Process.kill "TERM", pid 

# you have to wait for its termination, otherwise it will become a zombie process 
# (or you can use Process.detach) 
Process.wait pid 

này nên làm việc trên bất kỳ Unix như hệ thống. Windows tạo ra quy trình theo một cách khác.

+0

tuyệt vời. Cảm ơn nhiều. trong khi cố gắng những điều tôi đã có một "giải pháp" gần như giống hệt nhau mà gần như làm việc, nhưng unfornately tôi không thể tìm ra nơi nó đã được khác nhau. tôi cũng cần phải thêm một giấc ngủ sau khi giả mạo quá trình chờ cho đến khi máy chủ có sẵn. cảm ơn! – rubiii

+0

tôi đã có thể tái tạo sự khác biệt. tôi đã chạy Kernel # system thay vì Kernel # exec. Kernel # exec "thay thế quá trình hiện tại bằng cách chạy lệnh bên ngoài đã cho", nơi Kernel # system "thực hiện lệnh trong một subshell". – rubiii

+0

Quy trình con có thể tiếp tục hoạt động ngay cả khi tập lệnh ruby ​​thoát không? –

0

Tôi đã thử ngã ba, nhưng nó có nhiều vấn đề khi ActiveRecord tham gia vào cả hai quy trình. Tôi sẽ đề nghị Spawn plugin (http://github.com/tra/spawn). Nó chỉ ngã ba nhưng chăm sóc ActiveRecord.

+0

nếu bạn cần ar, giải pháp của bạn có thể là cách để đi. cảm ơn. nhưng tôi không thực sự cần phải sử dụng ar. – rubiii

2

Tôi chỉ phải làm điều gì đó tương tự và đây là những gì tôi nghĩ ra. @Michael Witrant của câu trả lời đã cho tôi bắt đầu, nhưng tôi đã thay đổi một số thứ như sử dụng Process.spawn thay vì ngã ba (newer and better).

# start spawns a process and returns the pid of the process 
def start(exe) 
    puts "Starting #{exe}" 
    pid = spawn(exe) 
    # need to detach to avoid daemon processes: http://www.ruby-doc.org/core-2.1.3/Process.html#method-c-detach 
    Process.detach(pid) 
    return pid 
end 

# This will kill off all the programs we started 
def killall(pids) 
    pids.each do |pid| 
     puts "Killing #{pid}" 
     # kill it (other signals than TERM may be used, depending on the program you want 
     # to kill. The signal KILL will always work but the process won't be allowed 
     # to cleanup anything) 
     begin 
     Process.kill "TERM", pid 

     # you have to wait for its termination, otherwise it will become a zombie process 
     # (or you can use Process.detach) 
     Process.wait pid 
     rescue => ex 
     puts "ERROR: Couldn't kill #{pid}. #{ex.class}=#{ex.message}" 
     end 
    end 
end 

# Now we can start processes and keep the pids for killing them later 
pids = [] 
pids << start('./someprogram') 

# Do whatever you want here, run your tests, etc. 

# When you're done, be sure to kill of the processes you spawned 
killall(pids) 

Đó là tất cả những gì cô ấy viết, hãy thử và cho tôi biết cách hoạt động.

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