我需要不时执行此操作并最终破解命令行,直到它工作为止。
例如,这里我想看看我有没有SSH连接,(“ps”返回的第8列是正在运行的“path-to-procname”并被“awk”过滤:
ps | awk -e '{ print $8 }' | grep ssh | sed -e 's/.*\///g'
然后我把它放在一个 shell 脚本中,(“eval”-ing 反引号内的命令行),像这样:
#!/bin/bash
VNC_STRING=`ps | awk -e '{ print $8 }' | grep vnc | sed -e 's/.*\///g'`
if [ ! -z "$VNC_STRING" ]; then
echo "The VNC STRING is not empty, therefore your process is running."
fi
“sed”部分修剪到确切令牌的路径,可能不是您的需要。
这是我用来获得您答案的示例。我编写它是为了自动创建 2 个 SSH 隧道并为每个隧道启动一个 VNC 客户端。
我从我的 Cygwin shell 运行它以从我的 Windows 工作站对我的后端进行管理,所以我可以用一个命令跳转到 UNIX/LINUX-land,(这也假设客户端 rsa 密钥已经是“ssh-copy -id"-ed 并且为远程主机所知)。
这是幂等的,因为每个 proc/command 仅在其 $VAR eval 为空字符串时触发。
它附加“| wc -l”来存储匹配的运行过程的数量(即找到的行数),而不是每个 $VAR 的 proc-name 以满足我的需要。我保留“echo”语句,以便重新运行并诊断两个连接的状态。
#!/bin/bash
SSH_COUNT=`eval ps | awk -e '{ print $8 }' | grep ssh | sed -e 's/.*\///g' | wc -l`
VNC_COUNT=`eval ps | awk -e '{ print $8 }' | grep vnc | sed -e 's/.*\///g' | wc -l`
if [ $SSH_COUNT = "2" ]; then
echo "There are already 2 SSH tunnels."
elif [ $SSH_COUNT = "1" ]; then
echo "There is only 1 SSH tunnel."
elif [ $SSH_COUNT = "0" ]; then
echo "connecting 2 SSH tunnels."
ssh -L 5901:localhost:5901 -f -l USER1 HOST1 sleep 10;
ssh -L 5904:localhost:5904 -f -l USER2 HOST2 sleep 10;
fi
if [ $VNC_COUNT = "2" ]; then
echo "There are already 2 VNC sessions."
elif [ $VNC_COUNT = "1" ]; then
echo "There is only 1 VNC session."
elif [ $VNC_COUNT = "0" ]; then
echo "launching 2 vnc sessions."
vncviewer.exe localhost:1 &
vncviewer.exe localhost:4 &
fi
这对我来说非常类似于 perl,并且可能比真正的 shell 脚本更多的是 unix utils。我知道有很多“魔法”数字和俗气的硬编码值,但它有效,(我认为我也对使用这么多大写字母的品味很差)。可以通过一些 cmd-line 参数添加灵活性以使其更加通用,但我想分享对我有用的东西。请改进和分享。干杯。