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。我在开始时打印 PID-s 以与ps命令的输出进行比较。

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的东西”职位名称“我可以在linux上设置属性吗?

答案1

尝试pgrep -f running_script--f选项使用整个命令行来匹配,而不仅仅是进程名称

答案2

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

这用于ps获取所有 bash 进程的 pid 和 args,然后使用 awk 打印匹配进程的 pid(字段 1)。

顺便说一句,ps -o pid,args -C bash给你 pid 和你要求的脚本文件的名称 - 脚本的名称在命令的参数中bash

如果您要使用ps而不是pgrep至少使用其全部功能,而不是极其丑陋的ps ... | grep -v grep | grep | awk构造。最后一个grep甚至不需要,因为awk可以执行模式匹配。事实上,这两个 grep 都不需要,因为 awk 可以完成这一切: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

相关内容