Aby*_*y W 5 shell signals background-process
我试图了解该dd
程序的联机帮助页,其中提到:
向正在运行的 'dd' 进程发送 USR1 信号使其将 I/O 统计信息打印到标准错误,然后恢复复制。
Run Code Online (Sandbox Code Playgroud)$ dd if=/dev/zero of=/dev/null& pid=$! $ kill -USR1 $pid; sleep 1; kill $pid
什么pid=$!
意思?
这是一个变量的赋值,它获取 piddd
吗?并最终用于$pid
变量?
还有他们为什么使用sleep
和kill
?
这是使用方法-USR1
吗?
dd if=/dev/zero of=/dev/null&
尾随&
表示在后台运行前缀命令。(免责声明:这是过于简单化的陈述)
参考这个:
$! 是最近的后台命令的PID。
所以pid=$!
把最近的后台PID赋值给变量pid,就是dd
PID。
还有为什么他们使用睡眠和杀戮?。
您需要kill $pid
(如果没有指定参数,kill 的默认信号是 TERM,即进程终止)dd
在完成测试后终止进程,否则dd
进程可能只是停留在后台并耗尽您的 CPU 资源。检查您平台的系统监视器以查看。
虽然Kill -USR1 $pid
打印 I/O 统计信息,但它不会终止进程。
如果没有 sleep 1 秒,您的dd
进程可能会被最后一条命令语句kill $pid
**终止,然后才有机会将统计输出写入终端。进程是同步的,但陷阱+写操作( kill -USR1 $pid
) 可能比终止操作( kill $pid
)慢。所以sleep 1
第二次延迟启动kill $pid
以确保统计输出完成打印。
这是使用-USR1的方法吗?
只是man dd
:
向正在运行的 'dd' 进程发送 USR1 信号使其将 I/O 统计信息打印到标准错误,然后恢复复制。
并且man 7 signal
:
Run Code Online (Sandbox Code Playgroud)SIGUSR1 30,10,16 Term User-defined signal 1 SIGUSR2 31,12,17 Term User-defined signal 2
结合这两个语句,你应该明白 USR1 是用户定义的信号,它被定义dd
为用户可以中断它并即时打印 I/O 统计信息。它是程序特定的处理程序,并不意味着您可以kill -USR1 other_program_pid
并期望统计输出。
您也可能对此感兴趣:为什么 SIGUSR1 会导致进程终止?.
这只是一个演示来说明USR1
信号的使用dd
。
dd if=/dev/zero of=/dev/null &
Run Code Online (Sandbox Code Playgroud)
dd
在后台开始,将数据从/dev/zero
(每当程序读取时产生零)复制到/dev/null
(丢弃写入的任何内容)。这提供了一个dd
可用于试验的无害实例——它不会耗尽任何存储空间,并且会在我们希望的时间内继续运行,这让用户有时间向它发送信号。
pid=$!
Run Code Online (Sandbox Code Playgroud)
将最后一个后台命令 ( $!
)的进程标识符存储在变量中pid
。
kill -USR1 $pid
Run Code Online (Sandbox Code Playgroud)
将USR1
信号发送到进程,其标识符是存储在pid
变量中的值,dd
在这种情况下是后台。当dd
接收到该信号时,它打印出其当前进展(数据量读取和写入)并继续复制。
sleep 1
Run Code Online (Sandbox Code Playgroud)
等待一秒钟。
kill $pid
Run Code Online (Sandbox Code Playgroud)
将TERM
信号发送到dd
,这将导致dd
退出。(让后台dd
在这里运行是没有意义的。)
运行它而不是上面的第二行会更有指导意义:
kill -USR1 $pid; sleep 1; kill -USR1 $pid; kill $pid
Run Code Online (Sandbox Code Playgroud)
这将输出两次进度,中间间隔一秒,以显示dd
进度;然后dd
不用等就杀了。
对于实际使用,您需要为原始dd
命令指定适当的输入和输出,可能还有其他一些选项,并且您不会运行最后一个kill
——您会等待dd
其自行完成。
要回答您的最后一个问题,这就是您USR1
从 shell(或任何其他信号)发送信号的方式:您使用kill
要发送的信号,以及要发送信号的进程的进程标识符(或作业标识符)到。当您想按名称查找进程时,您可以使用的其他(非 POSIX)命令是pkill
and killall
。
归档时间: |
|
查看次数: |
18638 次 |
最近记录: |