脚本内的ps aux和`ps aux`之间的结果不同
我有一个bash脚本( ScreamDaemon.sh ),其中添加了一个示例尚未运行的检查。
numscr=`ps aux | grep ScreamDaemon.sh | wc -l`;if [ "${numscr}" -gt "2" ]; then
echo "an instance of ScreamDaemon still running";
exit 0;
fi
通常情况下,如果有脚本运行没有另一个副本, 应该返回
(它应该找到自己和 grep ScreamDaemon.sh ),但是它返回 。
因此,我尝试分析会发生什么,并在添加一些回声后看到:
我已经在脚本中添加了几行
ps aux | grep ScreamDaemon.shps aux | grep ScreamDaemon.sh | wc -l
str=`ps aux | grep ScreamDaemon.sh`
echo $str
numscr=`ps aux | grep ScreamDaemon.sh | wc -l`;
echo $numscr
有一个输出:
pamela 27894 0.0 0.0 106100 1216 pts/1 S+ 13:41 0:00 /bin/bash ./ScreamDaemon.shpamela 27899 0.0 0.0 103252 844 pts/1 S+ 13:41 0:00 grep ScreamDaemon.sh
2
pamela 27894 0.0 0.0 106100 1216 pts/1 S+ 13:41 0:00 /bin/bash ./ScreamDaemon.sh pamela 27903 0.0 0.0 106100 524 pts/1 S+ 13:41 0:00 /bin/bash ./ScreamDaemon.sh pamela 27905 0.0 0.0 103252 848 pts/1 S+ 13:41 0:00 grep ScreamDaemon.sh
3
我也试图在 并从并行终端查看 显示了多少个实例:
[pamela@pm03 ~]$ ps aux | grep ScreamDaemon.shpamela 28394 0.0 0.0 106100 1216 pts/1 S+ 14:23 0:00 /bin/bash ./ScreamDaemon.sh
pamela 28403 0.0 0.0 106100 592 pts/1 S+ 14:23 0:00 /bin/bash ./ScreamDaemon.sh
pamela 28408 0.0 0.0 103252 848 pts/9 S+ 14:23 0:00 grep ScreamDaemon.sh
因此,似乎 与 相反
发现的两个实例 ScreamDaemon.sh ,但是为什么呢? ScreamDaemon.sh的
这个附加副本来自 何处 ?
这是pstree -ap命令的输出
│ ├─sshd,27806 │ │ └─sshd,27808
│ │ └─bash,27809
│ │ └─ScreamDaemon.sh,28731 ./ScreamDaemon.sh
│ │ └─ScreamDaemon.sh,28740 ./ScreamDaemon.sh
│ │ └─sleep,28743 2m
回答:
为什么单个bash脚本会在中多次显示ps
?
当隐式创建子外壳的任何构造都在起作用时,这是典型的。例如,在bash中:
echo foo | bar
…创建一个新的shell分叉副本以运行echo
,并使用其自己的ps
实例。类似地:
( bar; echo done )
…创建一个新的子shell,让该子shell运行外部命令bar
,然后让该子shell执行echo
。
类似地:
foo=$(bar)
…创建一个用于命令替换的子shell,bar
在其中运行(可能会exec
“执行命令并使用该子shell,但这不能保证”),然后将其输出读入父级。
现在,这如何回答您的问题?因为
result=$(ps aux | grep | wc)
… 在subshell中 运行该ps
命令,后者本身会创建一个额外的bash实例。 __
如何正确确保脚本的一个副本正在运行?
使用锁定文件。
请注意,我 建议您使用flock
基于-的变体。
以上是 脚本内的ps aux和`ps aux`之间的结果不同 的全部内容, 来源链接: utcz.com/qa/409900.html