当前位置: 首页 > 面试题库 >

脚本内的ps aux和`ps aux`之间的结果不同

乜业
2023-03-14
问题内容

我有一个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

通常情况下,如果有脚本运行没有另一个副本, 的ps aux | grep ScreamDaemon.sh | wc -l应该返回 2
(它应该找到自己和 grep ScreamDaemon.sh ),但是它返回 3

因此,我尝试分析会发生什么,并在添加一些回声后看到:

我已经在脚本中添加了几行

ps aux | grep ScreamDaemon.sh
ps 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.sh
pamela   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

我也试图在 ps aux |** 内部添加 **sleep** 命令 **。 grep ScreamDaemon.sh; 睡眠1m并从并行终端查看 ps aux | grep ScreamDaemon.sh 显示了多少个实例:

[pamela@pm03 ~]$ ps aux | grep ScreamDaemon.sh
pamela   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

因此,似乎 str =ps aux | grep ScreamDaemon.shps aux 相反 |
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中:

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)

在subshel​​l中 运行该ps命令,后者本身会创建一个额外的bash实例。 __

如何正确确保脚本的一个副本正在运行?

使用锁定文件

请注意,我 强烈 建议您使用flock基于-的变体。



 类似资料:
  • 问题内容: 阅读mozilla文档后,我发现了这一点: 在全局执行上下文中(在任何函数之外),这指的是全局对象,无论是否处于严格模式下。 在玩了一点示波器之后,我发现在node.js REPL中… 但是当我用同一行创建脚本时… 是否有一个原因?还是一个错误? 问题答案: 节点是全局的。文件中的代码位于“模块”中,它实际上只是一个函数。 您的代码文件变成了如下所示的简化示例: 请注意,它是使用来执行

  • 我有这个正则表达式:https://regex101.com/r/vxHtzh/1 我有四场比赛。 但是对于我简单的java代码,我有不同的输出。 输出: 我哪里做错了?

  • 前言:来自Microsoft论坛的交叉链接:http://social.msdn.microsoft.com/forums/office/en-us/47d1167b-24d0-43ed-b28b-21d8d82570a1/syncfolderhierarchy-differs-better-exchange-versions?forum=exchangesvrdevelopment 我一直在测试

  • 问题内容: 我有一个大问题。我使用此C#函数对消息进行编码: 在Java方面,我使用以下代码段: 我的消息是:阻止|注释|文本!£$%&/()=?^€> <{}ç°§;:_-。,@#ùàòè+ 我有这个结果: 你能帮我吗??谢谢… 问题答案: 我的猜测是您似乎正在将ASCII字节与Latin1字节进行比较。尝试切换 对此 那可能会解决您的问题。 (或切换C#以使用Latin1) 程序中发生的事情是

  • 问题内容: 我正在尝试构建一个应用程序,该应用程序使用流音频输入(例如:麦克风中的一条线),并使用IBM Bluemix(Watson)进行语音转文本。 我简要修改了此处找到的示例Java代码。此示例发送一个WAV,但是我发送的是FLAC …这[无关]不相关。 结果很差,非常差。这是使用Java Websockets代码时得到的: 现在,将上面的结果与下面的结果进行比较。这些是发送相同内容但使用c

  • 问题内容: 我有两个不同的程序,分别希望在Python和Java中使用Murmur3散列相同的字符串。 Python版本2.7.9: 给出79267961763742113019008347020647561319L。 Java是Guava 18.0: 给出字符串“ 6778ad3f3f3f96b4522dca264174a23b”,转换为BigInterger给出1375370730566806