我编写了一个脚本,在该脚本中,我需要使用同一脚本传递多个参数,该脚本将在一定时间后使用cron执行。为了确保没有多个脚本实例在运行,我进行了检查以检查脚本的进程是否正在使用ps -ef | grep -v grep | grep Connection_Manager.sh
当我使用执行检查时,我想检查脚本的运行过程中正在使用哪些参数ps -ef
。如何检查脚本运行过程中正在使用的参数?
关于检查该进程是否已经在运行,我会稍微更改您正在做的事情,pgrep
而改用它。
$ pgrep -f Connection_Manager.sh
$ pgrep -f Connection_Manager.sh
16293
该-f
开关允许pgrep
匹配整个命令行,而不仅仅是第一部分。
为此,您有两种方法。您也可以尝试从的输出中解析它们pgrep
。您需要添加其他开关-a
。
$ pgrep -af Conn
17306 /bin/bash ./Connection_Manager.sh arg1 arg2
然后用awk
,sed
或类似的东西来分析它们的输出。
和
$ pgrep -af ./Conn | sed 's/.*Connection_Manager.sh //'
arg1 arg2
awk
$ pgrep -af ./Conn | tr '\000' ' '| awk '{print $4, $5}'
arg1 arg2
这两种方法简直就是我的头等大事,毫无疑问,它们已经得到了简化。
但是取决于参数的数量和长度,如果命令行的长度过长,这可能会导致您出现问题。因此,我可能会选择第二种方法来解析进程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
这些文件之一是file cmdline
。但是您必须特别注意该文件的内容。该文件中的参数由NUL字符分隔。您可以用来cat -v <file>
在终端窗口中查看它们。
$ cat -v cmdline
/bin/bash^@./Connection_Manager.sh^@arg1^@arg2^@
这代替^@
了NUL。
因此,可以使用多种方式来解析内容,@ Joesph的答案中讨论了一种使用的方法xargs -0 ...
。另一个正在使用cat -v
。
xargs
$ xargs -0 < cmdline
/bin/bash ./Connection_Manager.sh arg1 arg2
猫
$ cat -v cmdline
/bin/bash^@./Connection_Manager.sh^@arg1^@arg2^@
您可以使用它sed
来稍微清理一下第二种方法。
$ cat -v cmdline | sed 's/\^@/ /g'
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句