Computer >> 컴퓨터 >  >> 프로그램 작성 >> Ruby

`top` 및 `ps`로 표시된 대로 Ruby 스크립트의 프로세스 이름을 변경하는 방법

Linux 또는 OSX에서 프로그램을 실행할 때마다 프로세스 내부에서 실행됩니다. 그리고 모든 프로세스에는 이름이 있습니다. 이름은 ps, top 또는 htop과 같은 명령을 실행할 때 표시되는 것입니다.

`top` 및 `ps`로 표시된 대로 Ruby 스크립트의 프로세스 이름을 변경하는 방법 htop은 가장 오른쪽 열에 프로세스 이름을 표시합니다.

기본 프로세스 이름은 무시할 수 있음

기본적으로 프로세스 이름은 실행 중인 프로그램이 포함된 실행 파일 이름에서 파생됩니다. 이것은 대부분의 실행 파일에서 잘 작동합니다. 결국 "less"를 실행할 때 프로세스 이름이 "less"여야 한다는 것이 이해가 됩니다.

그러나 기본 프로세스 이름은 명령줄에서 실행 중인 Ruby 스크립트가 있는 경우 덜 유용합니다. 아래 예에서 저는 5초 동안 휴면하는 루비 스크립트를 실행하고 있습니다. 다른 터미널 창에서 "ps"를 동시에 실행하면 내 슬리퍼의 프로세스 이름이 "ruby sleep_5_seconds.rb"인 것을 알 수 있습니다. 명령줄 인수를 추가하면 프로세스 이름에도 표시됩니다. 이렇게 하면 이름으로 프로세스를 참조하기가 어렵습니다.

`top` 및 `ps`로 표시된 대로 Ruby 스크립트의 프로세스 이름을 변경하는 방법 전체 ruby ​​명령이 프로세스 이름으로 나열됩니다.

프로세스 이름을 변경하는 방법

다행히 Ruby를 사용하면 현재 프로세스의 이름을 쉽게 변경할 수 있습니다. 다음은 업데이트된 스크립트입니다. 이제 프로세스 이름을 "sleeper"로 설정합니다.

# `Process.setproctitle()` is in Ruby >= 2.1
# For earlier versions of Ruby, you can use
#   $PROGRAM_NAME = "sleeper"
# or 
#   $0 = "sleeper"

Process.setproctitle("sleeper")
sleep 5

이제 프로그램을 실행하고 ps를 사용하여 제목을 표시하면 "sleeper"가 표시됩니다.

`top` 및 `ps`로 표시된 대로 Ruby 스크립트의 프로세스 이름을 변경하는 방법 Ruby에서 프로세스 제목을 변경하면 ps의 출력이 변경됩니다. 및 top

그러나 더 좋은 점은 이제 프로세스를 이름으로 쉽게 참조할 수 있다는 것입니다. 잠자는 사람이 잠들기를 기다리는 데 지쳤다고 가정해 봅시다. killall sleeper 명령을 사용하여 죽일 수 있습니다. .

`top` 및 `ps`로 표시된 대로 Ruby 스크립트의 프로세스 이름을 변경하는 방법 killall 이름으로 프로세스를 종료하는 명령

프로세스 이름을 통해 서버 상태 표시

프로세스 제목을 변경하는 새로운 기능의 흥미로운 용도 중 하나는 장기 실행 프로세스에 대한 상태 정보를 표시하는 것입니다. Unicorn을 실행한 적이 있다면 다음과 같이 친숙할 것입니다.

\-+= 27185 deply unicorn master -c simple_unicorn_config.rb -l0.0.0.0:8080
   |--- 27210 deply unicorn worker[0] -c simple_unicorn_config.rb -l0.0.0.0:8080
   |--- 27211 deply unicorn worker[1] -c simple_unicorn_config.rb -l0.0.0.0:8080
   |--- 27212 deply unicorn worker[2] -c simple_unicorn_config.rb -l0.0.0.0:8080
   |--- 27213 deply unicorn worker[3] -c simple_unicorn_config.rb -l0.0.0.0:8080

4개의 자식 프로세스가 있는 Unicorn의 인스턴스입니다. sleep_5_seconds.rb 예제와 마찬가지로 프로세스 이름은 프로세스를 시작하는 데 사용되는 명령을 보여줍니다.

작업자가 사용 중이거나 유휴 상태인 경우 상태 표시줄에 표시하는 것이 유용할 수 있습니다. 다음과 같습니다.

\-+= 27185 deply unicorn master -c simple_unicorn_config.rb -l0.0.0.0:8080
   |--- 27210 deply unicorn worker[0] -c simple_unicorn_config.rb -l0.0.0.0:8080 BUSY
   |--- 27211 deply unicorn worker[1] -c simple_unicorn_config.rb -l0.0.0.0:8080
   |--- 27212 deply unicorn worker[2] -c simple_unicorn_config.rb -l0.0.0.0:8080
   |--- 27213 deply unicorn worker[3] -c simple_unicorn_config.rb -l0.0.0.0:8080 BUSY

실제로 Rack 미들웨어를 사용하면 이 작업을 매우 쉽게 수행할 수 있습니다. 다음은 다음과 같은 예입니다.

class UpdateProcessTitle
  def initialize(app)
    @app = app
  end

  def call(env)
    title = $0
    $0 = $0 + " BUSY"
    status, headers, body = @app.call(env)
    $0 = title
    [status, headers, body]
  end
end

모든 웹 페이지 요청에서 프로세스 제목을 설정하는 것이 성능에 미치는 영향을 전혀 모릅니다. 따라서 이 모든 것을 소금 한 알과 함께 섭취하십시오. 하지만 여전히 꽤 멋진 아이디어입니다.

실제로 프로덕션에 사용된 이 아이디어의 고급 구현을 보려면 Unicorn 작업자 프로세스 이름 재정의에 대한 Thomas Varaneckas의 훌륭한 블로그 게시물을 확인하세요.