서버 실행시 명령어 제목을 어떻게 바꾸나요?

서버 실행시 명령어 제목을 어떻게 바꾸나요?

lsof -i4TCP:PORT사용자 정의 이름을 포함하도록 변경하려는 출력입니다 . 이는 데몬에 의해 시작된 서버 프로세스를 식별하는 데 도움이 됩니다. 아래에는 내가 제어하려는 항목을 가리키는 화살표가 있는 그림이 있습니다.

사용자 정의 보석을 만들고 거기에서 프로세스를 실행했는데 여전히 Ruby가 표시됩니다. 토끼굴로 내려가기보다는 다른 사람이 이러한 필요성을 갖고 있는지 생각해 보십시오. 나는 본질적으로 docker가 수행하는 모든 작업을 수행하고 내 프로그램 이름으로 태그가 지정된 프로세스를 표시하고 싶습니다.

저속 출력

답변1

프로세스 이름을 설정해야 합니다. 일부 시스템에서는 값 할당이 $0작동하지만 Linux에서는 작동하지 않습니다(적어도 내 버전에서는 아님 ruby). ruby매개변수 목록만 설정되거나( ps -f또는 에서와 같이 ps -o args) 프로세스 이름( 또는 lsof/ ps표시됨 ps -o comm)이 설정되지 않습니다( 설정 perl -e '$0 = "foo"'으로 작동함 ) perl프로세스 이름 및 매개변수 목록).

이렇게 하려면 Linux에서 다음을 수행해야 합니다.

prctl(PR_SET_NAME, "newname")

시스템 호출.

이렇게 할 수도 있지만:

$ ruby -e 'syscall(157, 15, "foo"); system("ps")'
  PID TTY          TIME CMD
5679 pts/4    00:00:01 zsh
8639 pts/4    00:00:00 foo
8641 pts/4    00:00:00 ps

시스템 호출의 값은 아키텍처에 따라 다릅니다(여기서는 amd64의 경우 157).

prctl그러나 소스 코드에서 greping을 수행해도 ruby아무 것도 표시되지 않으므로 프로세스 이름도 설정되지 않은 것 같습니다 ruby.Process.setproctitle()

SO의 @Jessehz에는 솔루션이 있습니다.fiddlepctrl()C 라이브러리에서 함수 호출 ( ruby동적으로 연결되었다고 가정합니다):

$ ruby -e 'require "fiddle"; Fiddle::Function.new(
  Fiddle::Handle["prctl".freeze], [Fiddle::TYPE_INT, Fiddle::TYPE_VOIDP],
  Fiddle::TYPE_INT).call(15, "foo"); system("ps")'
  PID TTY          TIME CMD
 5931 pts/5    00:00:02 zsh
 8943 pts/5    00:00:00 foo
 8945 pts/5    00:00:00 ps

답변2

훌륭한 답변을 주신 @Stéphane에게 감사드립니다. 하지만 내 경우에 가장 좋은 해결책은 내 스크립트를 Mac OSX 응용 프로그램으로 묶는 것이었습니다. 프로젝트의 Info.plist에서 프로세스 이름을 제어할 수 있습니다.

관련 정보