我是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 $1}' $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的正确语法。
一般来说,清理/改进脚本的建议也很受欢迎!
更新:将set -vx
添加到脚本顶部,这是一个有问题的迭代:
+ for i in 'gpe[[:digit:]]*'
awk '{print $1}' $i
++ awk '{print $1}' gpe66
+ num=1024908
+ (( 1024908 >= 1000 ))
+ cp gpe66 /root/gpe66.backup
+ echo disable
./kkiller: line 10: echo: write error: Invalid argument
答案 0 :(得分:6)
我在Alpine Linux环境中的Docker中也遇到了这个问题。我认为问题是默认情况下echo在字符串的末尾添加换行符,而内核不接受它,但在每个系统中都不是这样。在Docker中我遇到了这个错误,但是尽管出现了错误消息,仍然写了这个值。
解决方案(在Bash中):echo -n disable >/sys/firmware/acpi/interrupts/gpe66
。这样就不会回应换行符。
答案 1 :(得分:3)
仔细检查所有拼写。即使对于root,echo“disabled”也会发出写入错误,而echo“disable”会成功。
答案 2 :(得分:0)
我认为它与权限有关。我不认为root默认情况下对这些文件具有写访问权限。尝试手动回音'禁用'对于该文件,即使是root用户,也会显示相同的错误。所以为了使你的脚本工作,首先在你的回声之前在$ i上做chmod 744,它应该可以解决问题。
答案 3 :(得分:0)
我收到相同的错误消息,试图禁用已经设置为禁用的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
#