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
#