gpt4 book ai didi

linux - dd 实用程序尚未准备好接收终止信号

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:40:06 26 4
gpt4 key购买 nike

我有一个解压缩.gz 文件并将其复制到 block 设备的脚本。我使用 dd 获取有关进度的信息(我不能使用其他实用程序,如 pv 来执行此操作)。这是脚本的一部分:

#!/bin/sh

set -e
trap 'true' USR1

# ...

gunzip -c "${SVM_IMAGE_FILE_PATH}" | dd iflag=fullblock of="${TARGET_DEVICE_PATH}" bs=64M 2>"${DD_OUTPUT_FILE_PATH}" &
DD_PID=$!

echo "Decompression process has started: $$ -> ${DD_PID}" >> "${DECOMPRESSION_LOG_FILE_PATH}"

# Wait for dd process to become ready to receive 'kill -s USR1' signals
sleep 1

while (ps -p "${DD_PID}") >/dev/null 2>&1
do
set +e
kill -s USR1 $DD_PID 2>/dev/null

LAST_LINE=`tail -n 1 "${DD_OUTPUT_FILE_PATH}"`
case "${LAST_LINE}" in
*byte*)
BYTES_COPIED=`echo ${LAST_LINE} | cut -d ' ' -f1`
PROGRESS=$(( $(( $BYTES_COPIED * 100 )) / $DECOMPRESSED_FILE_SIZE ))
set_status "${PROGRESS}% processed"
;;
esac

# ...
set -e

sleep 1

done

如您所见,在 while 循环之前有一个 strage sleep 1。我想摆脱它,但我不知道该怎么做。如果我删除此 sleep 1dd 进程将在第一次调用 kill -s USR1 $DD_PID 后立即终止。也许这不会终止 dd,但它会以某种方式影响 gunzip 进程 — 我不知道到底发生了什么。

那么,有没有办法摆脱那个sleep 1

最佳答案

有两个问题:

  1. DD_PID 是运行管道的 shell 的 pid,而不是 dd
  2. SIGUSR1 将终止未准备好接收信号的进程。

shell 可能会选择在与优化相同的进程中执行 dd,但这不是您可以依赖的(尤其是在使用 /bin/sh 时) .

也不能依赖dd racing来设置信号陷阱,所以最好自己设置。

由于您使用的是 Linux,请考虑仅使用 GNU dd 标志 status=progress 来实现自动状态栏。

或者,将 shebang 更改为 #!/bin/bash 并使用:

trap '' USR1  # Ignore USR1 in inherited processes by default
dd iflag=fullblock of="${TARGET_DEVICE_PATH}" bs=64M 2>"${DD_OUTPUT_FILE_PATH}" \
< <(gunzip -c "${SVM_IMAGE_FILE_PATH}") &
dd_pid=$! # Is now 'dd's pid and not a shell's.

或者要符合sh:

fifo="/tmp/foo"
mkfifo "$fifo"
gunzip -c "${SVM_IMAGE_FILE_PATH}" | {
trap '' USR1
dd iflag=fullblock of="${TARGET_DEVICE_PATH}" bs=64M 2>"${DD_OUTPUT_FILE_PATH}" &
echo "$!" > "$fifo"
wait
} &
read dd_pid < "$fifo"
rm "$fifo"

或者使用 dash,将 shebang 更改为 #!/bin/dash 并将 trap 'true' USR1 更改为 trap '' USR1

关于linux - dd 实用程序尚未准备好接收终止信号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43766025/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com