Bash

如何在程序列表中檢查程序及其參數?

  • December 25, 2013

我編寫了一個腳本,我需要使用同一個腳本傳遞多個參數,該腳本在使用 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或類似的東西來解析他們的輸出。

sed

$ pgrep -af ./Conn | sed 's/.*Connection_Manager.sh //'
arg1 arg2

awk

$ pgrep -af ./Conn | tr '\000' ' '| awk '{print $4, $5}'
arg1 arg2

這兩種方法在我腦海中浮現,它們無疑可以被簡化。

使用 /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

這些文件之一是文件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'

參考

引用自:https://unix.stackexchange.com/questions/106568