bash - 스크립트 파일 이름을 사용하여 스크립트의 pid를 가져옵니다.

bash - 스크립트 파일 이름을 사용하여 스크립트의 pid를 가져옵니다.

두 개의 스크립트가 있습니다.

  • running_script
  • script_one

사용자 이름으로 실행 중인 모든 인스턴스의 PID를 가져온 running_script다음 하위 프로세스를 pkill중지 해야 합니다.running_script

우리가 기대하는 것은 다음과 같습니다.

ps -fu will | grep running_script

running_script프로세스를 찾아보세요 . 그러나 ps 명령 출력에 대해 PID를 확인하면 다음이 표시됩니다.지침예: 프로세스의 "bin/bash running_script"

running_script시작된 독립 프로세스( &운영자) 로 실행됩니다 script_one. ps명령의 출력과 비교하기 위해 처음에 PID를 인쇄합니다 .

running_script  &
echo $! -- $BASHPID

실제 사용 사례에서는 running_script일부 실행 중인 프로세스에 PID를 제공하지 않습니다. 또한 상위 프로세스에서 분리된 프로세스 script_one일 수도 있고 아닐 수도 있습니다 .running_script

연습 목적으로 script_one만 루프를 수행하십시오.

while [ true ]
do
    echo "  $0 - 35sec ..."
    sleep 35
done

그러나 이것은 단지 예일 뿐입니다. 요구 사항은 running_script상위 프로세스의 PID를 얻는 것입니다.

ps스크립트 파일의 이름과 PID를 제공할 수 있는 옵션이나 다른 명령이 있습니까 ? 아니면 이름을 어떻게 정하나요?할 수 있는검색 중인가요?

최종 사용 사례에서는 여러 인스턴스가 있을 수 있으므로 running_script이름으로 선택하는 것이 현재로서는 가장 좋은 옵션인 것 같습니다.

ps대부분의 응답이 이것이 작동할 것이라고 생각하는 것 같았기 때문에 명령이 표시하는 내용을 보여주는 것이 도움이 될 것이라고 생각했습니다 . 나는 이 예제를 얼마 전에 실행했습니다.

$  ./running_script &
$  echo $! - $BASHPID
9047 - 3261
$  ps -ef | grep will

  UID     PID  PPID  C STIME TTY          TIME CMD
  will   8862  2823  0 22:48 ?        00:00:01 gnome-terminal
  will   8868  8862  0 22:48 ?        00:00:00 gnome-pty-helper
  will   8869  8862  0 22:48 pts/4    00:00:00 bash
* will   9047  3261  0 22:55 pts/2    00:00:00 /bin/bash
  will   9049  9047  0 22:55 pts/2    00:00:00 /bin/bash
  will   9059  2886  0 22:56 pts/0    00:00:00 man pgrep
  will   9070  9059  0 22:56 pts/0    00:00:00 pager -s
  will  10228  9049  0 23:31 pts/2    00:00:00 sleep 35
  will  10232  8869  0 23:31 pts/4    00:00:00 ps -ef
  will  10233  8869  0 23:31 pts/4    00:00:00 grep --colour=auto william

PID #9047에 태그를 지정했습니다. 다음만 표시됩니다. - will 9047 3261 0 22:55 pts/2 00:00:00/bin/bash

aa와 비슷한 게 있나요?”직위"리눅스에서 속성을 설정할 수 있나요?

답변1

pgrep -f running_script프로세스 이름뿐만 아니라 전체 명령줄을 사용하여 일치시키려면 --f 옵션을 사용해 보십시오 .

답변2

ps -o pid,args -C bash | awk '/running_script/ { print $1 }'

ps이는 모든 bash 프로세스의 pid 및 args를 가져온 다음 awk를 사용하여 일치하는 프로세스(필드 1)의 pid를 인쇄하는 데 사용됩니다 .

그런데, ps -o pid,args -C bash요청한 스크립트 파일의 pid와 이름을 알려주세요. 스크립트 이름은 command 의 인수에 있습니다 bash.

ps만약 당신 이 그것을 사용한다면 pgrep최소한 극도로 보기 흉한 구조보다는 전체 기능을 사용하십시오 ps ... | grep -v grep | grep | awk. 패턴 일치를 수행할 수 있으므로 마지막 항목은 grep필요하지도 않습니다 . awk사실, awk가 모든 것을 할 수 있기 때문에 grep도 필요하지 않습니다:ps ax | awk '! /awk/ && /myprocessname/ { print $1}'

답변3

ps -ef | grep -v grep | grep <script_name> | awk '{print $2}'

위 명령은 script_name의 PID를 제공합니다. 또한 스크립트가 실행되는 PID를 사용하여 임시 파일에 스크립트를 쓰도록 할 수도 있습니다.

저장하기 위해현재 PID, 스크립트에 다음 줄을 추가합니다.

echo $$>/tmp/script_pid.tmp

답변4

#!/bin/bash

# pidofargs.sh
# get process id by first argument of a process
# using `ps -eo pid,args` and `read -a`

# sample use: pidofargs.sh python /usr/bin/youtube-dl

search_grep="$1" # first filter
search_arg1="$2" # second filter

# first filter
ps -eo pid,args | grep "$search_grep" | while read pid args
do
  read -a arg < <(echo "$args")

  # pid    = process id
  # arg[0] = executable file of process
  # arg[1] = first argument of process

  # second filter
  if [[ "${arg[1]}" == "$search_arg1" ]]
  then
    # success
    echo $pid
    break
  fi

done

관련 정보