如何使用自定义环境“执行”进程?

如何使用自定义环境“执行”进程?

我是在 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 会话时,程序将终止。

但是,当我尝试使用envlike运行此命令时$ /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

相关内容