Bash
如何在程序列表中檢查程序及其參數?
我編寫了一個腳本,我需要使用同一個腳本傳遞多個參數,該腳本在使用 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'
參考