그래요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