2014-08-28 131 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