사용자 정의 환경을 사용하여 프로세스를 "실행"하는 방법은 무엇입니까?

사용자 정의 환경을 사용하여 프로세스를 "실행"하는 방법은 무엇입니까?

그래요Bash에서 프로그래밍 방식으로 프로세스 생성. 임의의 환경 변수와 명령을 전달할 수 있어야 합니다. 이를 달성하기 위해 실행한 /usr/bin/env다음 을 호출합니다 bash -c. 때로는 시작하는 프로세스가 중지되지 않고 이를 종료하고 싶지만 명령에서 반환된 PID를 종료하면 다음으로 실행되는 하위 프로세스 대신 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

관련 정보