如何在进程列表中检查进程及其参数?

Ank*_*tha 4 shell bash ps shell-script

我写了一个脚本,我需要用同一个脚本传递几个参数,脚本在使用 cron 一段时间后执行。为了确保没有运行脚本的多个实例,我进行了检查以检查脚本的进程是否正在使用ps -ef | grep -v grep | grep Connection_Manager.sh

当我使用ps -ef. 如何检查脚本运行过程中正在使用的参数?

slm*_*slm 15

关于检查进程是否已经在运行,我会稍微改变你正在做的事情并pgrep改为使用。

$ pgrep -f Connection_Manager.sh
Run Code Online (Sandbox Code Playgroud)

例子

$ pgrep -f Connection_Manager.sh
16293
Run Code Online (Sandbox Code Playgroud)

该-f开关允许pgrep匹配整个命令行,而不仅仅是第一部分。

命令行参数

为此,您有几种方法。您也可以尝试从 的输出中解析它们pgrep。您需要添加一个额外的开关,-a。

例子

$ pgrep -af Conn
17306 /bin/bash ./Connection_Manager.sh arg1 arg2
Run Code Online (Sandbox Code Playgroud)

然后使用awk,sed或类似的东西来解析他们的输出。

sed

$ pgrep -af ./Conn | sed 's/.*Connection_Manager.sh //'
arg1 arg2
Run Code Online (Sandbox Code Playgroud)

awk

$ pgrep -af ./Conn | tr '\000' ' '| awk '{print $4, $5}'
arg1 arg2
Run Code Online (Sandbox Code Playgroud)

这 2 种方法是我的头顶,他们无疑可以精简。

使用 /proc/

但是根据参数的数量和长度,如果命令行的长度过长,这可能会导致您出现问题。所以我可能会使用第二种方法并解析进程cmdline文件的内容。每个进程在 Linux/proc文件系统中都有一组文件,其中包含有关该进程的元信息。

$ ls /proc/19146 
attr        cmdline          environ  limits     mountinfo   numa_maps      personality  stack    task
autogroup   comm             exe      loginuid   mounts      oom_adj        root         stat     timers
auxv        coredump_filter  fd       map_files  mountstats  oom_score      sched        statm    wchan
cgroup      cpuset           fdinfo   maps       net         oom_score_adj  sessionid    status
clear_refs  cwd              io       mem        ns          pagemap        smaps        syscall
Run Code Online (Sandbox Code Playgroud)

这些文件之一是文件cmdline. 但是你必须特别注意这个文件的内容。此文件中的参数由 NUL 字符分隔。您可以使用cat -v <file>在终端窗口中查看它们。

$ cat -v cmdline 
/bin/bash^@./Connection_Manager.sh^@arg1^@arg2^@
Run Code Online (Sandbox Code Playgroud)

这代替^@了 NUL。

因此可以通过多种方式解析内容,@Joesph 的回答中讨论了一种方法,使用xargs -0 .... 另一种是使用cat -v.

例子

参数

$ xargs -0 < cmdline 
/bin/bash ./Connection_Manager.sh arg1 arg2
Run Code Online (Sandbox Code Playgroud)

猫

$ cat -v cmdline 
/bin/bash^@./Connection_Manager.sh^@arg1^@arg2^@
Run Code Online (Sandbox Code Playgroud)

您可以使用sed此方法稍微清理一下。

$ cat -v cmdline | sed 's/\^@/ /g'
Run Code Online (Sandbox Code Playgroud)

参考