2014-08-28 142 views
2

我是一般的Linux世界的新手。我正在嘗試爲RaspPi構建一個記錄音頻並播放的小腳本。它做了更多,但這是我遇到的問題。下面是相關的代碼如何在ruby/bash腳本中殺死衍生的子進程

def start_recording 
    @file = rand(1000).to_s+".wav" 
    @pid = Process.spawn("sudo arecord > #{@file}") 
end 

def stop_recording 
    Process.kill('TERM', @pid) 
end 

def recording_looper 
    start_recording 
    interrupted = false 
    timer = Time.now 
    trap("INT") { interrupted = true } 
    until interrupted || (Time.now > timer + 5) do 
    #do nothing 
    end 
    stop_recording 
    get_input_from_user 
end 

基本上按預期工作彎針的精簡版本,無論是從用戶捕獲控制-C或5秒後停止記錄本身,而是Process.kill命令似乎沒有不工作。如果我在另一個終端窗口收聽wav,他們只是繼續前進。我該如何正確地殺死這個產生的記錄過程?

回答

1

您在您的命令行中調用sudosudo將在其啓動請求的命令後終止。存儲在@pid中的PID將是sudo的PID,而不是arecord過程的PID。

此外,以sudo開始的進程屬於另一個用戶(通常爲root)。你可能沒有權限殺死它們。

對於您的問題最簡單的解決方案可能是找到一種不需要sudo的方法。沒有明顯的原因,爲什麼在這裏需要root權限。

+0

sudo進程作爲子進程的所有者停留。你可以用'ps auxf'看到這個,看看'sudo'進程和子進程。不過,你是正確的,它是由root擁有的,你不能殺死它。對於我的例子,我使用了'sudo/bin/bash',但是對於其他進程,其行爲可能有所不同? – zerodiff 2014-08-28 14:05:56

-1

這裏是一個bash例子表明您可以sudo kill過程(我這樣做是在Ubuntu):

#!/bin/bash 

sudo -u `whoami` sleep 600 & 

pid=$! 

echo "Processes before kill:" 
ps axf | grep sudo | grep -v grep 
ps axf | grep sleep | grep -v grep 

sudo kill $pid 

echo "Processes after kill (should be empty):" 
ps axf | grep sudo | grep -v grep 
ps axf | grep sleep | grep -v grep 

這是結果:

$ ./test.sh 
Processes before kill: 
27275 pts/26 S+  0:00   | |  \_ sudo -u username sleep 600 
27275 pts/26 S+  0:00   | |  \_ sudo -u username sleep 600 
27279 pts/26 S+  0:00   | |  | \_ sleep 600 
Processes after kill (should be empty): 

所以,殺死它,你可以在Ruby或Bash中執行另一個命令sudo kill