我是在 bash 中以编程方式生成进程。我需要能够传递任意环境变量和命令。为了实现这一目标,我正在运行/usr/bin/env
,然后调用bash -c
.有时我启动的进程不会停止,我想杀死它,但是当我杀死从我的命令返回的 PID 时,它只会杀死 bash 命令,而不是 bash 运行的子进程。
我见过在 Bash 中将 SIGTERM 转发给子进程所以我认为这个问题可以用 bash 解决,exec
但是我无法调用正确的命令。
例如,这是一个永远不会退出的 ruby 脚本:
STDOUT.sync = true
puts "booted"
while true
puts "running"
sleep 1
end
当我通过运行它时$ exec ruby spec/fixtures/never_exits.rb
,程序的行为如我所愿。当我终止 bash 会话时,程序将终止。
但是,当我尝试使用env
like运行此命令时$ /usr/bin/env bash -c exec ruby spec/fixtures/never_exits.rb
,该命令立即退出并且没有输出。看起来脚本没有被调用。
是否可以exec
与指定环境变量结合使用?
是否有另一种方法可以将 TERM 传播到可以在一行中调用的子进程?
答案1
使用bash -c
类型结构时,您需要将整个命令放在"
字符内。例如
$ bash -c echo hello
$ bash -c "echo hello"
hello
所以在你的情况下
env bash -c "exec ruby script.rb"
然而,env
这个例子中的 并没有真正做太多事情;您的意思是env -i
创建一个初始环境吗?另外,除非 bash 启动脚本中发生了一些神奇的事情,否则您可能根本不需要 bash。
env -i RUBYPATH=/some/dir RUBYLIB=/other/dir /path/to/ruby script.rb