运行时umount /path我得到:
umount: /path: device is busy.
Run Code Online (Sandbox Code Playgroud)
文件系统很大,所以lsof +D /path不是一个现实的选择。
lsof /path, lsof +f -- /path, 并且fuser /path都没有返回。fuser -v /path给出:
USER PID ACCESS COMMAND
/path: root kernel mount /path
Run Code Online (Sandbox Code Playgroud)
这对于所有未使用的挂载文件系统来说是正常的。
umount -l而umount -f不是我的情况不够好。
我如何弄清楚为什么内核认为这个文件系统很忙?
time 如果您想弄清楚给定命令需要多少 CPU 时间,这是一个很棒的命令。
我正在寻找类似的东西,可以列出程序及其子项正在访问的文件。实时或事后报告。
目前我使用:
#!/bin/bash
strace -ff -e trace=file "$@" 2>&1 | perl -ne 's/^[^"]+"(([^\\"]|\\[\\"nt])*)".*/$1/ && print'
Run Code Online (Sandbox Code Playgroud)
但如果要运行的命令涉及sudo. 它不是很智能(如果它只能列出存在的文件或有权限问题的文件,或者将它们分组为读取的文件和写入的文件,那就太好了)。也strace很慢,所以选择更快的会更好。
(如果本题得分为72分,请不要投票!)
我跑了这个:
cat /usr/bin/* |
perl -ne 'map {$a{$_}++} split//; END{print map { "$a{$_}\t$_\n" } keys %a}' |
grep --text . | sort -n | plotpipe --log y {1}
Run Code Online (Sandbox Code Playgroud)
并得到这个:
(即使使用对数 y 轴,它看起来仍然是指数的!顶部和底部之间的距离超过 100 倍)
看一下数字:
:
31919597 ^H
32983719 ^B
33943030 ^O
39130281 \213
39893389 $
52237360 \211
53229196 ^A
76884442 \377
100776756 H
746405320 ^@
Run Code Online (Sandbox Code Playgroud)
^@ (NUL) 是可执行文件中最常见的字节,这并不奇怪。\377 (255) 和 ^A (1) 对我来说也具有直观意义。
但是,是什么导致“H”(72)成为可执行文件中第二常见的字节——比 255 和 1 更常见呢?
背景
对于 Perl 脚本,我需要找到 Perl 脚本中最不常见的字节。意外的是,我没有只 grep 出 Perl 脚本,而是对所有二进制文件运行了该命令。我预计有几个字节会脱颖而出,例如 …
我在鼠标垫周围按了一些东西(altgr 区域中的键 + 鼠标垫 - 很可能是多点触控),突然整个 X11 显示器放大了 10% 左右。这意味着我可以在有点模糊的版本中看到 1920x1080 屏幕的 90%。当我移动光标时,90% 跟随光标,因此通过平移我可以看到屏幕上的所有内容。由于它适用于一切,我猜测它是由 xfwm 或 Xorg 引起的。
如果我暂停机器,它似乎在锁定屏幕中消失了,但是当锁定屏幕解锁时,模糊和缩放重新出现。截取屏幕截图会抓取屏幕上显示的内容(即 90% 但缩放到 1920x1080)。
我可以在某些情况下看到它的用处,但我真的很想退出它(除了重新启动)。
我在 Linux Mint 上使用 xfce。
time 如果您想弄清楚给定命令需要多少 CPU 时间,这是一个很棒的命令。
我正在寻找类似的东西,可以测量程序和任何孩子的最大 RAM 使用量。最好应该区分已使用和未使用的已分配内存。也许它甚至可以给出中值内存使用量(因此在长时间运行时您应该期望内存使用量)。
所以我想做:
rammeassure my_program my_args
Run Code Online (Sandbox Code Playgroud)
并获得类似于以下内容的输出:
Max memory allocated: 10233303 Bytes
Max memory used: 7233303 Bytes
Median memory allocation: 5233303 Bytes
Run Code Online (Sandbox Code Playgroud)
我看过memusg https://gist.github.com/526585/590293d6527c91e48fcb08edb8de9fd6c88a6d82但我认为这有点像黑客。
对于 KVM 远程控制台,我需要能够运行jnlp文件。当我运行它时,我得到:
net.sourceforge.jnlp.LaunchException: Fatal: Initialization Error: Could not initialize application.
at net.sourceforge.jnlp.Launcher.createApplication(Launcher.java:797)
at net.sourceforge.jnlp.Launcher.launchApplication(Launcher.java:555)
at net.sourceforge.jnlp.Launcher$TgThread.run(Launcher.java:908)
Caused by: net.sourceforge.jnlp.LaunchException: Fatal: Application Error: Cannot grant permissions to unsigned jars. Application requested security permissions, but jars are not signed.
at net.sourceforge.jnlp.runtime.JNLPClassLoader.setSecurity(JNLPClassLoader.java:319)
at net.sourceforge.jnlp.runtime.JNLPClassLoader.<init>(JNLPClassLoader.java:239)
at net.sourceforge.jnlp.runtime.JNLPClassLoader.getInstance(JNLPClassLoader.java:381)
at net.sourceforge.jnlp.runtime.JNLPClassLoader.getInstance(JNLPClassLoader.java:337)
at net.sourceforge.jnlp.Launcher.createApplication(Launcher.java:789)
... 2 more
Run Code Online (Sandbox Code Playgroud)
我明白您为什么不希望浏览器运行任意未签名的代码。
但在这种情况下,我没有机会更改或签署代码,因为它来自 KVM 设备。
我目前正在使用 Linux Mint 和 Chrome。
我希望能够通过 ssh 发送信号(SIGINT 是最重要的)。
这个命令:
ssh server "sleep 1000;echo f" > foo
Run Code Online (Sandbox Code Playgroud)
将在服务器上开始睡眠,并在 1000 秒后将 'f\n' 放在我本地机器上的文件 foo 中。如果我按 CTRL-C(即向 ssh 发送 SIGINT),它将终止 ssh,但不会终止远程服务器上的 sleep。我希望它杀死远程服务器上的睡眠。
所以我试过:
ssh server -t "sleep 1000;echo f" > foo
Run Code Online (Sandbox Code Playgroud)
但如果 stdin 不是终端,我会收到此错误:
Pseudo-terminal will not be allocated because stdin is not a terminal.
Run Code Online (Sandbox Code Playgroud)
然后 SIGINT 仍然没有转发。
所以我试过:
ssh server -t -t "sleep 1000;echo f" > output
Run Code Online (Sandbox Code Playgroud)
但是 foo 中的输出不是 'f\n' 而是 'f\r\n' 这在我的情况下是灾难性的(因为我的输出是二进制数据)。
在上面我使用“sleep 1000;echo f”,但实际上它是由用户提供的,因此它可以包含任何内容。然而,如果我们可以让它适用于“sleep 1000;echo f”,我们很可能让它适用于所有现实情况。
我真的不关心在另一端获得伪终端,但我一直无法找到任何其他方式让 ssh 转发我的 SIGINT。
还有其他方法吗?
编辑:
用户可以给出从 …
我有一个 100 M 行的文件,它适合 GNU/Linux 系统上的 RAM。
这是相当慢的:
sort bigfile > bigfile.sorted
Run Code Online (Sandbox Code Playgroud)
并且没有在我的机器上使用所有 48 个内核。
如何快速对该文件进行排序?
是的,我知道你在想什么:“到底是谁给他们的文件命名的`a`b?”
但是让我们假设您确实有一个名为`a`b(可能是由疯狂的 Mac 用户创建的 - 显然不是您创建的)的文件,并且您想要rsync该文件。显而易见的解决方案:
rsync server:'./`a`b' ./.;
rsync 'server:./`a`b' ./.;
Run Code Online (Sandbox Code Playgroud)
给出:
bash: line 1: a: command not found
rsync: [sender] link_stat "/home/tange/b" failed: No such file or directory (2)
rsync error: some files/attrs were not transferred (see previous errors) (code 23) at main.c(1865) [Receiver=3.2.7]
rsync: [Receiver] write error: Broken pipe (32)
Run Code Online (Sandbox Code Playgroud)
甚至:
rsync server:'./`a`b' ./.;
rsync 'server:./`a`b' ./.;
Run Code Online (Sandbox Code Playgroud)
rsync我应该运行什么命令?
bash: line 1: a: command not found
rsync: …Run Code Online (Sandbox Code Playgroud) 我有一个 1 TB 的文件。我想从字节 12345678901 读取到字节 19876543212 并将其放在具有 100 MB RAM 的机器上的标准输出上。
我可以轻松编写一个执行此操作的 perl 脚本。sysread 提供 700 MB/s(很好),但 syswrite 仅提供 30 MB/s。我想要更高效的东西,最好是每个 Unix 系统都安装的东西,并且可以以 1 GB/s 的速度交付。
我的第一个想法是:
dd if=1tb skip=12345678901 bs=1 count=$((19876543212-12345678901))
Run Code Online (Sandbox Code Playgroud)
但这效率不高。
编辑:
我不知道我是如何测量 syswrite 错误的。这提供了 3.5 GB/s:
perl -e 'sysseek(STDIN,shift,0) || die; $left = shift; \
while($read = sysread(STDIN,$buf, ($left > 32768 ? 32768 : $left))){ \
$left -= $read; syswrite(STDOUT,$buf);
}' 12345678901 $((19876543212-12345678901)) < bigfile
Run Code Online (Sandbox Code Playgroud)
并避免yes | dd bs=1024k count=10 | wc噩梦。