我有两个脚本:
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