我正在尝试使用 dd 和 pv 将 iso 写入 USB 驱动器。我做了:
iso="myiso.iso"; dd if="$iso" bs=1M | pv --eta --size $(ls -l "$iso" | awk '{print $5}') --progress --bytes --rate --wait > /dev/sdg
Run Code Online (Sandbox Code Playgroud)
遵循本指南:https : //gist.github.com/rriemann/1406035
但是,发生的情况是根据 pv 的输出非常快速地“写入”iso。我猜它都被放到了磁盘缓存或类似的地方。然后 pv 就挂了。ps 显示 pv 仍在运行,但 dd 不是。我试过 stracing pv,但没有输出,strace 也挂了!ctrl+c 对 strace 没有影响。事实上,它不响应信号 15、3、2 或 1。为每个信号等待几分钟。我最终被迫发送了 9。
根据这个:http : //www.reddit.com/r/linux/comments/1xvr25/linux_tip_dont_use_kill_9/ strace 二进制文件表现不佳。
以下是我的问题:
如何让光伏报告更有用的数据?我知道它可能正在做它“应该做的”,即,只是报告它管道的字节。但这对我想知道的内容没有帮助,这是对写入 USB 驱动器、eta 等的字节的粗略估计。
为什么 strace 不响应任何信号?我的猜测是,在处理下一个信号之前,strace 会等待来自它正在监视的进程的系统调用,我认为这是一个错误。但这只是一个猜测。strace 版本 4.5.20。
尝试创建一个空文件并跟踪删除它所涉及的操作。名单很长:
touch a
strace rm a
execve("/bin/rm", ["rm", "a"], [/* 20 vars */]) = 0
brk(0) = 0x65f000
access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory)
mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fd579b94000
access("/etc/ld.so.preload", R_OK) = -1 ENOENT (No such file or directory)
open("/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=25132, ...}) = 0
mmap(NULL, 25132, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7fd579b8d000
close(3) = 0
access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory)
open("/lib/x86_64-linux-gnu/libc.so.6", O_RDONLY|O_CLOEXEC) = …Run Code Online (Sandbox Code Playgroud) 如果我运行 rsh,它可以工作,但会在开头打印一些奇怪的“连接被拒绝”消息:
$ rsh localhost pwd
connect to address 127.0.0.1 port 544: Connection refused
Trying krb4 rsh...
connect to address 127.0.0.1 port 544: Connection refused
trying normal rsh (/usr/bin/rsh)
/home/service
Run Code Online (Sandbox Code Playgroud)
但是如果我在 strace 下运行 rsh,它根本不会连接到服务器:
$ strace -c rsh localhost ulimit -n
connect to address 127.0.0.1 port 544: Connection refused
Trying krb4 rsh...
connect to address 127.0.0.1 port 544: Connection refused
trying normal rsh (/usr/bin/rsh)
rcmd: socket: Permission denied
% time seconds usecs/call calls errors syscall
------ ----------- ----------- --------- --------- …Run Code Online (Sandbox Code Playgroud) 任何人都可以理解这个strace输出吗?
[pid 25302] read(34, "}B\311\204\n\250\347$\220\266kRb\304a^^\2504\303k\235\227T\223\16\231\306\277\254\256\306", 32) = 32
Run Code Online (Sandbox Code Playgroud)
它来自通过 Tomcat 运行 Java 应用程序的 Linux 系统。它试图读取一些东西,但它有这个奇怪的字符串,而不是文件名。这是我认为应用程序失败的地方,也是我不明白的部分。
所以我试图通过以下“Hello World!”来理解系统调用。程序:
#include <stdio.h>
int main(){
printf("Hello World!\n");
return 0;
}
Run Code Online (Sandbox Code Playgroud)
然后我在可执行文件上运行 strace 并得到以下信息:
execve("./hello", ["./hello"], [/* 62 vars */]) = 0
brk(0) = 0x85a5000
mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb774f000
access("/etc/ld.so.preload", R_OK) = -1 ENOENT (No such file or directory)
open("/home/miguel/GNUstep/Library/Libraries/tls/i686/sse2/libc.so.6", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
stat64("/home/miguel/GNUstep/Library/Libraries/tls/i686/sse2", 0xbf8df160) = -1 ENOENT (No such file or directory)
open("/home/miguel/GNUstep/Library/Libraries/tls/i686/libc.so.6", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
stat64("/home/miguel/GNUstep/Library/Libraries/tls/i686", 0xbf8df160) = -1 ENOENT (No such …Run Code Online (Sandbox Code Playgroud) strace运行指定的命令直到它退出。它拦截并记录进程调用的系统调用和进程接收到的信号。
在 bash shell 中运行外部命令时,shell 首先fork()是子进程,然后是子进程中execve()的命令。所以我想这strace会报告fork()或类似的东西,例如clone()
但下面的例子表明它没有。为什么在命令之前不strace报告父shellfork()子进程execve()?谢谢。
$ strace -f time
execve("/usr/bin/time", ["time"], [/* 66 vars */]) = 0
brk(0) = 0x84c000
access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory)
mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7efe9b2a5000
access("/etc/ld.so.preload", R_OK) = -1 ENOENT (No such file or directory)
open("/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=141491, ...}) = 0
mmap(NULL, 141491, PROT_READ, MAP_PRIVATE, …Run Code Online (Sandbox Code Playgroud) 我试图调用一个自定义函数funk_a,strace但它似乎没有找到它。我确认 funk_a 可以被自己调用。我很欣赏任何意见。
$ source ./strace_sample.sh
$ funk_a
Earth, Wind, Fire and Water
$ funk_b
Get on up
strace: Can't stat 'funk_a': No such file or directory
$ dpkg -p strace|grep Vers
Version: 4.8-1ubuntu5
$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu 14.04.5 LTS
Release: 14.04
Codename: trusty
Run Code Online (Sandbox Code Playgroud)
strace_sample.sh
#!/bin/bash
function funk_a {
echo "Earth, Wind, Fire and Water"
}
function funk_b {
echo "Get on up"
strace -o trace_output.txt -c …Run Code Online (Sandbox Code Playgroud) 我进行了系统调用并重新编译了内核,但是在运行系统调用时它返回了 Killed。因此,为了跟踪它,我使用了 strace,它显示了以下消息:
syscall_0x224(0x7ffda7199738, 0x7ffda7199748, 0x55743750a6d0, 0x7f9f20df7d80, 0x7f9f20df7d80, 0x7ffda7199730) = ?
这是什么意思(不是十六进制,问号)?
我跟踪了一个curl命令:
strace -s 2000 -f curl google.com
Run Code Online (Sandbox Code Playgroud)
并看到 2 个 DNS 查询
recvfrom(3, "\302\325\201\200\0\1\0\1\0\0\0\0\6google\3com\0\0\34\0\1\6google\3com\0\0\34\0\1\0\0\0\362\0\20*\0\24P@\t\10\v\0\0\0\0\0\0 \16", 2048, 0, {sa_family=AF_INET, sin_port=htons(53), sin_addr=inet_addr("192.168.65.7")}, [28->16]) = 66
recvfrom(3, "X\320\201\200\0\1\0\1\0\0\0\0\6google\3com\0\0\1\0\1\6google\3com\0\0\1\0\1\0\0\1)\0\4\216\372\263\356", 65536, 0, {sa_family=AF_INET, sin_port=htons(53), sin_addr=inet_addr("192.168.65.7")}, [28->16]) = 54
Run Code Online (Sandbox Code Playgroud)
然后,我看到对 142.250.179.238 的 connect() 系统调用,这是 Google 的 IP。
connect(3, {sa_family=AF_INET, sin_port=htons(80), sin_addr=inet_addr("142.250.179.238")}, 16) = 0
Run Code Online (Sandbox Code Playgroud)
我相信2个recvfrom调用之一包含IP“142.250.179.238”,否则curl无法知道要连接的IP。
我的问题:2个recvfrom字符串的格式是什么?以及如何解析它来获取IP地址?
"\302\325\201\200\0\1\0\1\0\0\0\0\6google\3com\0\0\34\0\1\6google\3com\0\0\34\0\1\0\0\0\362\0\20*\0\24P@\t\10\v\0\0\0\0\0\0 \16"
"X\320\201\200\0\1\0\1\0\0\0\0\6google\3com\0\0\1\0\1\6google\3com\0\0\1\0\1\0\0\1)\0\4\216\372\263\356"
Run Code Online (Sandbox Code Playgroud) 当我这样做时strace echo hello,我看到它正在使用/bin/echo,但echo应该首先找到内置的。跳过内置命令是strace的功能吗?strace -- 版本 4.5.19
我知道 strace 不能像处理系统可执行文件那样处理内置命令。