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

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

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

사용자 정의 보석을 만들고 거기에서 프로세스를 실행했는데 여전히 Ruby라고 표시됩니다. '토끼 구멍'으로 내려가기보다는 다른 사람이 이런 필요를 갖고 있는지 궁금해합니다. 나는 본질적으로 docker가 수행한 작업을 정확하게 수행하고 내 프로그램 이름으로 태그된 프로세스를 표시하고 싶습니다.

LSOF 출력

답변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의 소스 코드에서 grepping 은 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에서 프로세스 이름을 제어할 수 있습니다.

관련 정보