研究 Linux 版 powershell,却找到了 Linux 的 bug?

2019-03-20 11:24:07 +08:00
 ps1aniuge
------- [环境] -------
虚拟机,centos 7.6
kernel 升级到了最新 kernel.x86_64.0.3.10.0-957.10.1.el7
find 版本最新 findutils-4.5.11-6.el7.x86_64

QQ 群号=183173532
名称=powershell 交流群
群内创作文章,著作权所有者为群

------- [问题从这里开始] -------
我想,用 powershell 统计,系统最大的 10 个文件。


------- [ linux 的 powershell 命令 1,返回的结果] -------
PS /root> Get-ChildItem / -file -Recurse | Sort-Object length -Descending -top 10 |Select-Object {$_.length / 1mb},fullname

$_.length / 1mb FullName
--------------- --------
134217726.007812 /proc/kcore
101.161056518555 /usr/lib/locale/locale-archive
77.8723373413086 /usr/bin/dockerd-ce
65.3838729858398 /usr/bin/docker
63.01171875 /var/lib/rpm/Packages
51.1564149856567 /boot/initramfs-0-rescue-314df5eb857b4ced8b7d82f9365999e7.img
42.2908325195312 /usr/bin/containerd
29.62109375 /var/cache/yum/x86_64/7/base/gen/primary_db.sqlite
28.40234375 /var/cache/yum/x86_64/7/epel/gen/primary_db.sqlite
27.015625 /opt/microsoft/powershell/6.0.5/System.Management.Automation.dll



------- [ linux 的 powershell 命令 2,返回的结果] -------
du -sh (Get-ChildItem / -file -Recurse | Sort-Object length -Descending -top 10 ).fullname
0 /proc/kcore
102M /usr/lib/locale/locale-archive
78M /usr/bin/dockerd-ce
66M /usr/bin/docker
64M /var/lib/rpm/Packages
52M /boot/initramfs-0-rescue-314df5eb857b4ced8b7d82f9365999e7.img
43M /usr/bin/containerd
30M /var/cache/yum/x86_64/7/base/gen/primary_db.sqlite
29M /var/cache/yum/x86_64/7/epel/gen/primary_db.sqlite
28M /opt/microsoft/powershell/6.0.5/System.Management.Automation.dll


我的想法:
咦?怎么变 0 了?我还是用 [正宗 linux 命令] 试试吧。


------- [ linux 的 find 命令 1,返回的结果] -------
find / -type f -exec du -sh {} + | sort -rh | head -n 10
du: 无法访问"/proc/3933/task/3933/fdinfo/6": 没有那个文件或目录
du: 无法访问"/proc/3933/fdinfo/6": 没有那个文件或目录
102M /usr/lib/locale/locale-archive
78M /usr/bin/dockerd-ce
66M /usr/bin/docker
64M /var/lib/rpm/Packages
52M /boot/initramfs-0-rescue-314df5eb857b4ced8b7d82f9365999e7.img
43M /usr/bin/containerd
30M /var/cache/yum/x86_64/7/base/gen/primary_db.sqlite
29M /var/cache/yum/x86_64/7/epel/gen/primary_db.sqlite
28M /opt/microsoft/powershell/6.0.5/System.Management.Automation.dll
27M /opt/microsoft/powershell/6-preview/System.Management.Automation.dll



------- [ linux 的 find 命令 2,返回的结果] -------
find / -type f -print0 | xargs -0 du -h | sort -rh | head -n 10
du: 无法访问"/proc/4157/task/4157/fdinfo/6": 没有那个文件或目录
102M /usr/lib/locale/locale-archive
78M /usr/bin/dockerd-ce
66M /usr/bin/docker
64M /var/lib/rpm/Packages
52M /boot/initramfs-0-rescue-314df5eb857b4ced8b7d82f9365999e7.img
43M /usr/bin/containerd
30M /var/cache/yum/x86_64/7/base/gen/primary_db.sqlite
29M /var/cache/yum/x86_64/7/epel/gen/primary_db.sqlite
28M /opt/microsoft/powershell/6.0.5/System.Management.Automation.dll
27M /opt/microsoft/powershell/6-preview/System.Management.Automation.dll



------- [ linux 的 find 命令 3,返回的结果] -------
find / -type f -ls | sort -k 7 -r -n | head -10 | column -t | awk '{print $7,$11}'
find: ‘/proc/4267/task/4267/fdinfo/6 ’: 没有那个文件或目录
find: ‘/proc/4267/fdinfo/5 ’: 没有那个文件或目录
140737486266368 /proc/kcore
106075056 /usr/lib/locale/locale-archive
81655064 /usr/bin/dockerd-ce
68559960 /usr/bin/docker
66072576 /var/lib/rpm/Packages
53641389 /boot/initramfs-0-rescue-314df5eb857b4ced8b7d82f9365999e7.img
44345152 /usr/bin/containerd
31059968 /var/cache/yum/x86_64/7/base/gen/primary_db.sqlite
29782016 /var/cache/yum/x86_64/7/epel/gen/primary_db.sqlite
28327936 /opt/microsoft/powershell/6.0.5/System.Management.Automation.dll



------- [我的疑问] -------

问 1:linux 上所有都是文件么?
是的话,find,du 为什么会报那些错?谁来答答?



问 2:/proc/kcore 是文件么?
测试代码:
root@centos76 ~]#ls -l
-r--------. 1 root root 140737486266368 3 月 20 10:57 /proc/kcore



问:find 不加 [-print0 ] 参数后,能算 [最大 10 个文件] 么?
答:不行。
欢迎帮忙测试,下面的命令:
find / -type f | xargs -0 du -h | sort -rh | head -n 10

find / -type f | xargs du -h | sort -rh | head -n 10




问:加上 [-print0 ] 参数后,返回消失了,这是 find 的 bug 么?
测试代码:
[root@centos76 ~]# find /proc -name 'kc*' -type f
/proc/kcore

/proc/kcore[root@centos76 ~]# find /proc -name 'kc*' -type f -print0
返回空,即无返回



问: [ find / -type f -exec du -sh {}] 也有丢文件的 bug,对么?
答:
应该是 du 的问题。

测试代码:
find /proc -name 'kc*' -type f
/proc/kcore

find /proc -name 'kc*' -type f -exec du -sh {} +
0 /proc/kcore




------- [结论] -------
我认为:
[ linux 的 powershell 命令 1,返回的结果]
[ linux 的 find 命令 3,返回的结果]
靠谱点。
虽然 [/proc/kcore ] 返回的结果我并不需要。

当然,我也认为,没占磁盘,du 不应该返回。

powershell 那两个返回都是可以的,find 的返回就不乐观了。
7113 次点击
所在节点    Linux
51 条回复
reus
2019-03-20 11:38:39 +08:00
/proc 下的数字目录表示的是进程的信息,而进程会一直创建和销毁,你统计这个有何意义……都是虚拟的文件,不占磁盘空间

排除 /proc 再统计吧

ncdu 更好用
catalina
2019-03-20 11:40:47 +08:00
/proc/数字 这里面的都是各个进程(数字是 pid)的基本信息,如果这个 pid 代表的进程结束了,那么就会弹找不到文件。。。
先找一下 /proc 下都是啥牛鬼蛇神不好吗?
CallMeReznov
2019-03-20 11:46:38 +08:00
提醒一下
本人原来学习 powershell 在国内几个 QQ 群里都待过,建议还是不要进为好,学习讨论氛围太差!
尤其是此贴宣传的 QQ 群.
举个例子,当年 wannacry 爆发之前几个月有相关的网站爆出 SMB 漏洞,我转帖到那个群里
被群管理"传教士"以"黑客小子,脚本小子"为理由封禁了,后来我就直接退了.这种群根本不是做技术讨论的.
CallMeReznov
2019-03-20 11:47:40 +08:00
如果硬要去,另外一个群比较不错,讨论分析问题不会受到奇葩的限制或者干扰,不过就是爱吵架.
chinvo
2019-03-20 11:50:36 +08:00
水瓶子不满,晃荡
msg7086
2019-03-20 11:51:41 +08:00
@CallMeReznov 笑死……管理员怕不是小学生吧
msg7086
2019-03-20 11:56:11 +08:00
至于楼主这个为什么变成 0,因为 du 并不是查看文件大小的,而是查看文件占用空间的。
如果只要找最大的 10 个文件,那应该用 du --apparent-size 来统计文件大小,而不是用 du 来统计文件占用空间。

最后,Linux 的 bug 在哪?
Narcissu5
2019-03-20 12:12:33 +08:00
Powershell 是个神奇的东西,我觉得只有完全不用 shell 的人才会设计出 Get-Item 这样的命令
CallMeReznov
2019-03-20 12:20:44 +08:00
@Narcissu5 #8 PS 命令很多都是这样啊,把结果对象化,这样就不需要其他 shell 塞过来塞过去的选择
毕竟有时候需要写正则还是很痛苦的,直接把结果按照变成语言的方式.XX 的呈现给你多方便?
xcai
2019-03-20 12:26:56 +08:00
基础不牢,地动山摇
pynix
2019-03-20 12:39:47 +08:00
建议 bl0ck
Narcissu5
2019-03-20 12:49:24 +08:00
@CallMeReznov 对象化概念我还是很喜欢的,毕竟 shell 基于文本的方式确实太蛋疼的。我是说语法,Get-item 又有大写又有小写还有符号,运维用这个估计想死的心都有
momocraft
2019-03-20 12:53:27 +08:00
建议看一遍 unix 痛恨者手册
neoblackcap
2019-03-20 13:04:23 +08:00
@Narcissu5 powershell 的开发有 IDE 补全,而且他们那套规则就是这样,一个动词加名词,不用自己解析结果是最好的,多少 shell 命令都是在做简单结果解析。
lihongjie0209
2019-03-20 13:32:41 +08:00
@CallMeReznov
@neoblackcap
给 Linux 装 power shell 运行时或者 IDE 还不如直接用 python 写代码,解决一些已解决的问题不知道有什么意思
CallMeReznov
2019-03-20 13:41:43 +08:00
@lihongjie0209 #15 主要还是跨平台通用的问题吧,.NET 都上 LINUX 了 相应的 PS 可以直接调用.NET 等于是 1+1=3 的好事
不过这又是微软一手好牌打的稀烂,最终结果还是去学 BASH 或 PY.
PS 国内社区都没有



@neoblackcap #14 ISE 选中多少运行多少的功能真的是领先啊..
ps1aniuge
2019-03-20 13:43:00 +08:00
原来进程已经销毁了,感谢 1 楼 2 楼。

3 楼,群是专业群,不过,群里不许分享黑客,提问黑客。

感谢 7 楼,果然出来了,
du --apparent-size -h (Get-ChildItem / -file -Recurse | Sort-Object length -Descending -top 10 ).fullname
128T /proc/kcore
102M /usr/lib/locale/locale-archive
78M /usr/bin/dockerd-ce
66M /usr/bin/docker
64M /var/lib/rpm/Packages
52M /boot/initramfs-0-rescue-314df5eb857b4ced8b7d82f9365999e7.img
43M /usr/bin/containerd
30M /var/cache/yum/x86_64/7/base/gen/primary_db.sqlite
29M /var/cache/yum/x86_64/7/epel/gen/primary_db.sqlite
28M /opt/microsoft/powershell/6.0.5/System.Management.Automation.dll


[root@centos76 ~]# find /proc -name 'kc*' -type f -exec du --apparent-size {} +
137438951432 /proc/kcore

问:最后,Linux 的 bug 在哪?
答:加上 [-print0 ] 参数后,返回消失了,这是 find 的 bug 么?
ps1aniuge
2019-03-20 13:59:06 +08:00
Get-item 又有大写又有小写还有符号,运维用这个估计想死的心都有-----------在 win,linux 中的 powershell 中。( linux 叫 pwsh )你输入小写的 get-i 然后打 tab 即可。 若你输入 get-item,也能正常运行。所有命令不区分大小写,还支持中文文件名,中文脚本名,中文参数名,中文变量名。

大家看看这个脚本:
$a = jc 检测 [win-linux 进程命令行中] 关键字的并发数 2.ps1 -想要检测的关键字 'xxx.jar'
$a #如果有两个 xxx.jar 进程 ,则$a 返回 2

打 jc + tab,即可补全脚本名。
打 - + tab,即可补全参数名 “-想要检测的关键字”


PS 国内社区都没有---------楼主的群,就是 ps for win,linux ps 社区,就是精品社区。。
lihongjie0209
2019-03-20 14:00:00 +08:00
@CallMeReznov Windows 就是瞎搞, 你一个 Linux 的软件居然需要另外一个 repl 去调用, 实在是难以想象。
CallMeReznov
2019-03-20 14:08:52 +08:00
@ps1aniuge 拉倒吧 什么叫提问黑客,安全防护是整个行业一环,转发一个安全新闻就叫黑客提问,windows 恰恰是最需要关注相关知识的地方。
我看你就是传教士本人吧


你居然那么不知趣我也就明说了
QQpowershell 唯二的两个群其中一个就是躲避你的
搞个 QQ 群跟土大王一样,群里气氛弄得跟宗教传教一样

ps 没上 linux 之前怎么黑 linux 的自己都忘了?
还专业群,宗教群吧!

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/546510

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX