bash - echo: write error: invalid argument
bash - echo: write error: invalid argument
我是 bash 的新手,正在尝试编写一个禁用 kworker 业务的脚本,如 aMaia 的回答 here 所示。
到目前为止,我有这个,我从 root 运行:
1 #!/bin/bash
2
3 cd /sys/firmware/acpi/interrupts
4 for i in gpe[[:digit:]]* # Don't mess with gpe_all
5 do
6 num=`awk '{print }' $i`
7 if (( $num >= 1000 )); then # potential CPU hogs?
8 # Back it up and then disable it!!
9 cp $i /root/${i}.backup
10 echo "disable" > $i
11 fi
12 done
但是运行它会导致:
./kkiller: line 10: echo: write error: Invalid argument
这是怎么回事?我认为 $i
只是文件名,这似乎是 echo 的正确语法。
清理建议 up/improving 总体脚本也很受欢迎!
更新:将 set -vx
添加到脚本顶部,这是一个有问题的迭代:
+ for i in 'gpe[[:digit:]]*'
awk '{print }' $i
++ awk '{print }' gpe66
+ num=1024908
+ (( 1024908 >= 1000 ))
+ cp gpe66 /root/gpe66.backup
+ echo disable
./kkiller: line 10: echo: write error: Invalid argument
我认为它与权限有关。我不认为 root 默认情况下对这些文件没有写权限。尝试手动回显 'disable' 到该文件,即使是 root 用户也会看到相同的错误。所以为了让你的脚本工作,首先在你的 echo 之前对 $i 执行 chmod 744,它应该可以做到。
仔细检查所有拼写。 echo "disabled" 即使对于 root 也会发出写入错误,而 echo "disable" 会成功。
我在 Alpine linux 环境的 Docker 中也遇到了这个问题。我认为问题在于默认情况下 echo 在字符串末尾放置一个换行符,内核不接受它,但并非每个系统都是如此。在 Docker 中我遇到了这个错误,但尽管有错误消息,该值还是被写入了。
解决方案(在Bash):echo -n disable >/sys/firmware/acpi/interrupts/gpe66
。这样就不会回显换行符。
我在尝试禁用已设置为禁用的 GPE 时收到相同的错误消息:
# echo "disable" > /sys/firmware/acpi/interrupts/gpe17
-su: echo: write error: Invalid argument
# cat /sys/firmware/acpi/interrupts/gpe17
3718289 STS disabled unmasked
启用后,我可以无误地禁用它:
# echo "enable" > /sys/firmware/acpi/interrupts/gpe17
# echo "disable" > /sys/firmware/acpi/interrupts/gpe17
#
我是 bash 的新手,正在尝试编写一个禁用 kworker 业务的脚本,如 aMaia 的回答 here 所示。
到目前为止,我有这个,我从 root 运行:
1 #!/bin/bash
2
3 cd /sys/firmware/acpi/interrupts
4 for i in gpe[[:digit:]]* # Don't mess with gpe_all
5 do
6 num=`awk '{print }' $i`
7 if (( $num >= 1000 )); then # potential CPU hogs?
8 # Back it up and then disable it!!
9 cp $i /root/${i}.backup
10 echo "disable" > $i
11 fi
12 done
但是运行它会导致:
./kkiller: line 10: echo: write error: Invalid argument
这是怎么回事?我认为 $i
只是文件名,这似乎是 echo 的正确语法。
清理建议 up/improving 总体脚本也很受欢迎!
更新:将 set -vx
添加到脚本顶部,这是一个有问题的迭代:
+ for i in 'gpe[[:digit:]]*'
awk '{print }' $i
++ awk '{print }' gpe66
+ num=1024908
+ (( 1024908 >= 1000 ))
+ cp gpe66 /root/gpe66.backup
+ echo disable
./kkiller: line 10: echo: write error: Invalid argument
我认为它与权限有关。我不认为 root 默认情况下对这些文件没有写权限。尝试手动回显 'disable' 到该文件,即使是 root 用户也会看到相同的错误。所以为了让你的脚本工作,首先在你的 echo 之前对 $i 执行 chmod 744,它应该可以做到。
仔细检查所有拼写。 echo "disabled" 即使对于 root 也会发出写入错误,而 echo "disable" 会成功。
我在 Alpine linux 环境的 Docker 中也遇到了这个问题。我认为问题在于默认情况下 echo 在字符串末尾放置一个换行符,内核不接受它,但并非每个系统都是如此。在 Docker 中我遇到了这个错误,但尽管有错误消息,该值还是被写入了。
解决方案(在Bash):echo -n disable >/sys/firmware/acpi/interrupts/gpe66
。这样就不会回显换行符。
我在尝试禁用已设置为禁用的 GPE 时收到相同的错误消息:
# echo "disable" > /sys/firmware/acpi/interrupts/gpe17
-su: echo: write error: Invalid argument
# cat /sys/firmware/acpi/interrupts/gpe17
3718289 STS disabled unmasked
启用后,我可以无误地禁用它:
# echo "enable" > /sys/firmware/acpi/interrupts/gpe17
# echo "disable" > /sys/firmware/acpi/interrupts/gpe17
#