【发布时间】:2018-05-21 23:12:02
【问题描述】:
我正在尝试获取进程开始的时间。 通常我在我正在运行的进程的第一个字母上使用方括号。 它消除了 ps 输出中的自我报告“grep”。
#!/bin/bash
set -x
restarTXG="sendevent -E FORCE_STARTJOB -J CASPERRT_CD_TXG_DR_STR_PS"
bounceTXG="sendevent -E FORCE_STARTJOB -J CASPERRT_CD_TXG_DR_STP_PS; sleep 10 ; sendevent -E FORCE_STARTJOB -J CASPERRT_CD_TXG_DR_STR_PS"
timeofTXG=$(ps -ef | grep [t]xg | awk '{print $5}' )
if [ -n "$timeofTXG" ] ; then
printf "%s\n" "The TXG_DR is ON as of $timeofTXG"
else
printf "%s\n" "'The TXG_DR is OFF"
fi
18:40 是我运行检查脚本的时间。 17:44 是进程开始的时间。
++ ps -ef
++ grep '[t]xg'
++ awk '{print $5}'
+ timeofTXG='17:44
18:40
18:40'
+ '[' -n '17:44
18:40
18:40' ']'
+ printf '%s\n' 'The TXG_DR is ON as of 17:44
18:40
18:40'
The TXG_DR is ON as of 17:44
18:40
18:40
我真的不知道方括号是如何工作的。当我从命令行运行 ps 时,[] 括号确实有效—— ps -ef | grep [t]xg | awk '{打印 $5}' 但是在 bash 脚本的上下文中,它们不起作用,它们给了我自我报告 grep 的时间。 括号是如何工作的?为什么它们在命令行而不是在脚本中工作?如何摆脱 bash 脚本中的自我揭示 grep ?
【问题讨论】:
-
如果当前目录中有任何同名的文件,您需要使用引号来防止
[t]xg被 shell 替换为txg。也就是说,代码应该是'[t]xg'。 -
...或者,最好不要使用 grep
ps,而是使用专用工具,例如pgrep。 -
或者,甚至更好的是,甚至不要查看进程表,而是编写您的软件以使用咨询锁定或操作系统提供的进程监督系统(systemd、 runit、daemontools、upstart、launchd,不管它是什么)。
-
方括号是Grep Regex。您应该谨慎使用您并不真正了解的工具。每当你看到某件事“仅仅因为它起作用”时,你通常应该尝试找出它为什么起作用,因为只要情况发生一点变化,就很难适应你不知道它是如何起作用的东西。你的新情况。
-
@Davy 是的 - 我正在努力理解这些工具。