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 种方法是我的头顶,他们无疑可以精简。
但是根据参数的数量和长度,如果命令行的长度过长,这可能会导致您出现问题。所以我可能会使用第二种方法并解析进程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)
| 归档时间: |
|
| 查看次数: |
15980 次 |
| 最近记录: |