【问题标题】:ps -ef | { head -n 1 ; sort ; } Unexpected output [closed]ps -ef | { 头 -n 1 ;种类 ;意外的输出[关闭]
【发布时间】:2020-10-13 09:32:06
【问题描述】:

为什么下面会在第二行删掉root这个词并倾斜输出,而不是对以下所有行保持一致?

# ps -ef | { head -n 1 ; sort ; } | head -n11

UID        PID  PPID  C STIME TTY          TIME CMD
      470     2  0 Oct07 ?        00:00:00 [xfsaild/nvme4n1]
apache   10210  5801  0 Oct12 ?        00:04:04 /var/site/fastcgi.pl                                 
apache   10211  5801  0 Oct12 ?        00:03:11 /var/site/fastcgi.pl                                 
apache   10212  5801  0 Oct12 ?        00:03:35 /var/site/fastcgi.pl                                 
apache   10265  5801  0 Oct12 ?        00:03:55 /var/site/fastcgi.pl                                 
apache   10325  5801  0 Oct12 ?        00:03:50 /var/site/fastcgi.pl                                 
apache   10328  5801  0 Oct12 ?        00:03:39 /var/site/fastcgi.pl                                 
apache   10329  5801  0 Oct12 ?        00:02:59 /var/site/fastcgi.pl                                 
apache   10330  5801  0 Oct12 ?        00:03:50 /var/site/fastcgi.pl                                 
apache   11889  3815  0 Oct08 ?        00:33:11 /usr/sbin/httpd -k start

我希望输出能够打印出来:

# ps -ef | { head -n 1 ; sort ; } | head -n2

UID        PID  PPID  C STIME TTY          TIME CMD
root       470     2  0 Oct07 ?        00:00:00 [xfsaild/nvme4n1]

这似乎是一个竞态条件。有时当我运行它时它不会发生。

$ ps -ef | { head -n 1 ; sort ; } | head -n3
UID          PID    PPID  C STIME TTY          TIME CMD
avahi       1328       1  0 Oct12 ?        00:00:08 avahi-daemon: running [danied.local]
avahi       1401    1328  0 Oct12 ?        00:00:00 avahi-daemon: chroot helper

【问题讨论】:

  • 您的问题不清楚。没有样本数据。它是不可重现的。
  • 您的命令输出不是确定性的,由于双方都要求关闭管道的竞争条件,请查看以下示例。

标签: bash pipe head


【解决方案1】:

你的命令会受到竞争条件的影响,更具体地说,head -n1 可以在第二个命令设法获得任何输入之前关闭后面的管道,如果第一个命令也已经结束。

考虑这个例子:

> cat test.sh
for ((i=1;i<=3; i++)); do
    printf "$i\n"
    # sleep 1
done

如果你运行这个多次,你会得到不同的结果

> sh test.sh | { head -n1; tail -n +1; }
1
> sh test.sh | { head -n1; tail -n +1; }
1
2
3

如果您在循环中取消注释 sleep 1 语句,两个命令都将获得输入。因为管道不会从第一个命令立即关闭,所以第二部分肯定会等待,尽管第一个 head 已经完成。

【讨论】:

    【解决方案2】:

    当我启动这个命令时,我得到的是:

    Prompt> ps -ef | { head -n 1 ; sort ; } | head -n11
    UID        PID  PPID  C STIME TTY          TIME CMD
    
    Prompt> uname -a
    Linux ...-Microsoft #488-Microsoft Mon Sep 01 13:43:00 ... GNU/Linux
    

    这更有意义:ps -ef 显示所有正在运行的进程,head -n 1 只显示第一行,其余的并不重要。

    您能否再次运行该命令并查看一切是否与您所说的一样,然后运行uname -a 命令,以验证您正在使用哪种类型的机器? (env | grep -i "shell" 的结果也可能有用)。只需相应地编辑您的问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-05-04
      • 2013-02-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多