小编Ole*_*nge的帖子

在 zsh 中列出别名、函数和变量的名称

我需要一种方法来列出 zsh 中别名、函数、变量、数组的名称(不包括正文/内容/值)。最好它应该表现得像compgen

compgen -a # will list all the aliases you could run.
compgen -A function # will list all the functions you could run.
compgen -A variable # will list all the variables defined.
Run Code Online (Sandbox Code Playgroud)

背景

我需要这个来开发 env_parallel.zsh:https ://www.gnu.org/software/parallel/env_parallel.html

shell zsh

17
推荐指数
1
解决办法
1万
查看次数

修复 ulimit:打开文件:无法修改限制:不允许操作

我在不同的 GNU/Linux 安装上对此进行了测试:

perl -e 'while(1){open($a{$b++}, "<" ,"/dev/null") or die $b;print " $b"}'
Run Code Online (Sandbox Code Playgroud)

系统 A 和 D

我遇到的第一个限制是 1024。通过将其放入 /etc/security/limits.conf 可以轻松提高:

*                hard    nofile          1048576
Run Code Online (Sandbox Code Playgroud)

然后运行:

ulimit -n 1048576
echo 99999999 | sudo tee /proc/sys/fs/file-max
Run Code Online (Sandbox Code Playgroud)

现在测试转到 1048576。

但是,似乎我无法将其提高到 1048576 以上。如果我将 1048577 放在limits.conf 中,它就会被忽略。

这是什么原因造成的?

系统B

在系统 BI 上甚至无法到达 1048576:

echo 99999999 | sudo tee /proc/sys/fs/file-max
Run Code Online (Sandbox Code Playgroud)

/etc/security/limits.conf:

*                hard    nofile          1048576
Run Code Online (Sandbox Code Playgroud)

在这里我得到:

$ ulimit -n 65537
bash: ulimit: open files: cannot modify limit: Operation not permitted
$ ulimit -n 65536
#OK …
Run Code Online (Sandbox Code Playgroud)

linux file-descriptors limit ulimit

15
推荐指数
1
解决办法
5万
查看次数

speedtest-cli:ValueError:int() 的无效文字,基数为 10:''

在 3 台机器上,我得到:

$ speedtest-cli 
Retrieving speedtest.net configuration...
Traceback (most recent call last):
  File "/usr/bin/speedtest-cli", line 11, in <module>
    load_entry_point('speedtest-cli==2.1.2', 'console_scripts', 'speedtest-cli')()
  File "/usr/lib/python3/dist-packages/speedtest.py", line 1986, in main
    shell()
  File "/usr/lib/python3/dist-packages/speedtest.py", line 1872, in shell
    speedtest = Speedtest(
  File "/usr/lib/python3/dist-packages/speedtest.py", line 1091, in __init__
    self.get_config()
  File "/usr/lib/python3/dist-packages/speedtest.py", line 1173, in get_config
    ignore_servers = list(
ValueError: invalid literal for int() with base 10: ''
Run Code Online (Sandbox Code Playgroud)

我已经在两个不同的互联网连接上测试了其中一台机器,结果相同。

为什么它不起作用?

bandwidth testing

15
推荐指数
2
解决办法
1万
查看次数

测量程序的磁盘 I/O 使用情况

time 如果您想弄清楚给定命令需要多少 CPU 时间,这是一个很棒的命令。

我正在寻找类似的东西,可以测量程序和任何子项的磁盘 I/O。它最好区分缓存的 I/O(因此不会导致磁盘旋转)和未缓存的 I/O。

所以我想做:

iomeassure my_program my_args
Run Code Online (Sandbox Code Playgroud)

并获得类似于以下内容的输出:

Cached read: 10233303 Bytes
Cached write: 33303 Bytes  # This was probably a tmp file that was erased before making it to the disk
Non-cached read: 200002020 Bytes
Non-cached write: 202020 Bytes
Run Code Online (Sandbox Code Playgroud)

我看过vmstat, iostat, 和sar,但这些都不是在看一个过程。相反,他们着眼于整个系统。

我已经看过了iotop,但这只能让我看到这一瞬间。

- - 编辑 - -

snap的答案似乎很接近。

“文件系统输入:”是 512 字节块中的非缓存读取。

“文件系统输出:”是 512 字节块中的缓存写入。

您可以使用以下命令强制清空缓存:

sync ; echo 3 | sudo tee /proc/sys/vm/drop_caches >/dev/null
Run Code Online (Sandbox Code Playgroud)

我测试了:

 seq …
Run Code Online (Sandbox Code Playgroud)

io measure time

14
推荐指数
1
解决办法
2526
查看次数

GNU/Linux:覆盖块设备/可堆叠块设备

GNU/Linux 具有覆盖目录的联合挂载。因此,您可以在只读目录之上安装可写目录。当可写目录被卸载时,只读目录保持不变。

我正在为块设备寻找相同的功能 - 最好将可写部分存储在文件中。所以我想运行类似的东西:

device-setup /dev/newdevice /dev/read-only-device overlayfile
Run Code Online (Sandbox Code Playgroud)

如果我写入 /dev/newdevice 更改应该存储在覆盖文件中。如果我读取写入的扇区,我应该从覆盖文件中获取数据。如果我读取未写入的扇区,我应该从 /dev/read-only-device 获取数据。

有这样的工具吗?

block-device loop-device snapshot

14
推荐指数
1
解决办法
6245
查看次数

在已排序的文本文件中进行二分查找

我有一个包含数十亿行可变长度的大排序文件。给定一个新行,我想知道如果它已包含在排序文件中,它将获得哪个字节数。

例子

a\n
c\n
d\n
f\n
g\n
Run Code Online (Sandbox Code Playgroud)

给定输入 'foo' 我会得到输出 9。

这很容易通过简单地遍历整个文件来完成,但是由于数十亿行的可变长度,进行二分搜索会更快。

这样的文本处理工具是否已经存在?

编辑:

现在可以了:https : //gitlab.com/ole.tange/tangetools/blob/master/2search

search text-processing

14
推荐指数
2
解决办法
5126
查看次数

无需重新压缩即可将 gzip 文件拆分为较小的 gz 文件

我有一个很大的 .gz 文件。我想将其拆分为 100 个较小的 gzip 文件,每个文件都可以自行解压缩。换句话说:我不是在寻找一种将 .gz 文件切成块的方法,这些块必须重新组合在一起才能解压缩。我希望能够独立解压缩每个较小的文件。

可以在不重新压缩整个文件的情况下完成吗?

原文件压缩后可以--rsyncable吗?(“通过定期重置压缩数据流的内部结构,更好地满足 rsync 程序的需求。”听起来这些重置点可能是拆分的好地方,并且可能会预先添加一个标头。)

可以为任何其他压缩格式完成吗?我想bzip2是可行的 - 因为它是按块压缩的。

gzip

13
推荐指数
1
解决办法
3916
查看次数

mptscsih: ioc0: task abort: SUCCESS (rv=2002) 导致 30 秒冻结

我的软件 RAID6 的 I/O 经常冻结大约 30 秒,之后一切都恢复正常。

冻结结束后,将其放入系统日志:

Mar 14 18:43:57 server kernel: [35649.816060] sd 5:0:23:0: [sdy] CDB: Read(10): 28 00 6c 52 68 58 00 04 00 00
Mar 14 18:43:58 server kernel: [35651.149020] mptbase: ioc0: LogInfo(0x31140000): Originator={PL}, Code={IO Executed}, SubCode(0x0000) cb_idx mptscsih_io_done
Mar 14 18:43:58 server kernel: [35651.151962] mptscsih: ioc0: task abort: SUCCESS (rv=2002) (sc=ffff8807b02dfe80)
Mar 14 18:43:58 server kernel: [35651.151967] mptscsih: ioc0: attempting task abort! (sc=ffff88002a7f30c0)
Mar 14 18:43:58 server kernel: [35651.151972] sd 5:0:23:0: [sdy] CDB: Read(10): …
Run Code Online (Sandbox Code Playgroud)

drivers scsi timeout linux-kernel

12
推荐指数
2
解决办法
3万
查看次数

加速复制1000000个小文件

我有百万4-20 KB文件的目录(可以产生类似的这样的文件:seq 10000 | gzip > a; seq 1000000 | parallel --bar 'head -c{=$_=int(rand()*16)+4=}k a > {}'

. 我需要复制那个目录。但似乎我必须为每个文件做一个搜索,所以这需要很长时间。

有什么方法可以加快速度吗?

我目前在想,如果我能得到这些文件占用的磁盘块,我可以对它们进行排序,合并接近的块(鉴于顺序读取通常比寻找更快)并读取这些块,以便它们在 RAM 中在进行复制之前缓存(我有 32 GB RAM)。

但是为了让它工作,我需要一种方法来识别文件所在的块。

我在磁性设备(即不是 SSD)上使用 EXT4。

编辑:

这应该有效,但它没有:

ls |
parallel -IOO --pipe "sudo parallel -j100 hdparm --fibmap {}'|tail -n +5'" |
sort -nk 2 | 
perl -ane 'if($u+10000 < $F[1]) { print "$l ",($u-$l),"\n"; $l=$F[1] } $u=$F[2]' |
sudo parallel --colsep ' ' dd if=/dev/sda1 skip={1} bs=512 count={2} '| cat >/dev/null'
Run Code Online (Sandbox Code Playgroud)

在大文件上测试时,它不会缓存文件。

编辑2: …

filesystems cache

12
推荐指数
2
解决办法
8350
查看次数

内存不足,但交换可用

即使有可用的交换,我的服务器也耗尽了内存。

为什么?

我可以这样重现它:

eat_20GB_RAM() {
  perl -e '$a="c"x10000000000;print "OK\n";sleep 10000';
}
export -f eat_20GB_RAM
parallel -j0 eat_20GB_RAM ::: {1..25} &
Run Code Online (Sandbox Code Playgroud)

当稳定(即所有进程都进入睡眠状态)时,我再运行一些:

parallel --delay 5 -j0 eat_20GB_RAM ::: {1..25} &
Run Code Online (Sandbox Code Playgroud)

当稳定(即所有进程都进入睡眠状态)时,使用大约 800 GB RAM/swap:

$ free -m
              total        used        free      shared  buff/cache   available
Mem:         515966      440676       74514           1         775       73392
Swap:       1256720      341124      915596
Run Code Online (Sandbox Code Playgroud)

当我再运行一些时:

parallel --delay 15 -j0 eat_20GB_RAM ::: {1..50} &
Run Code Online (Sandbox Code Playgroud)

我开始得到:

Out of memory!
Run Code Online (Sandbox Code Playgroud)

即使有明显的交换可用。

$ free
              total        used        free      shared  buff/cache   available
Mem:      528349276   518336524     7675784       14128 …
Run Code Online (Sandbox Code Playgroud)

linux swap virtual-memory ram

12
推荐指数
1
解决办法
945
查看次数