Bash - echo: 写入错误:无效参数。

7

我是新手,正在尝试编写一个脚本来禁用kworker业务,就像aMaia在这里的答案中所述。

到目前为止,我有以下内容,我从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

你需要查看 $i 中存储的值,在脚本的第一行后添加 set -vx。这样你就可以得到 shell 的调试/跟踪输出。我认为你会发现 $i 的值类似于 gpe99,这在你的测试 (( $num > = 1000 )) 中是无法工作的。关于 echo "disable" > $i,我不确定,所以请在你的问题中包含更多的调试输出,这样我们才能帮助你。(在输出中执行的命令和错误消息)。祝你好运。 - shellter
4个回答

10

我在 Alpine Linux 环境下使用 Docker 时也遇到了这个问题。我认为问题是 echo 命令默认在字符串末尾添加换行符,而内核不接受它,但并非所有系统都是如此。在 Docker 中,我遇到了这个错误,但是实际上该值已经被写入。

解决办法(在 Bash 中):echo -n disable >/sys/firmware/acpi/interrupts/gpe66。这样就不会输出换行符。


4

请仔细检查所有的拼写。即使是 root 用户,使用 echo "disabled" 也会导致写入错误,而使用 echo "disable" 则会成功。


是的!! 成功了!在某种 MacBook Pro 上安装了 Kubuntu 17.10。 - fheshwfq

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
# 

0

我认为这与权限有关。我认为默认情况下root没有对这些文件的写访问权限。尝试手动将“disable”输出到该文件,即使作为root,您也会看到相同的错误。因此,为了使您的脚本正常工作,在echo之前首先对$i执行chmod 744,这应该可以解决问题。


嗯...这仍然会出现相同的错误。我之前一直手动操作都没有问题,所以这肯定很奇怪! - norman
1
如果你可以执行 echo disable > /sys/firmware/acpi/interrupts/gpe66,那么问题就在别处。但是我刚刚在我的系统上尝试了一下,似乎它是有效的。 - MajorT
可能真的是权限问题,因为(也许我在问题中应该澄清),通过“从根目录运行”我指的是执行sudo -i然后执行脚本,这导致了错误。相反,如果我执行sudo ./kkiller,它就像魔术般地工作。(?!) - norman
让我感到惊讶的是,据我所知,这两种情况没有区别,因为在这两种情况下,程序都将在用户根目录下执行。 - MajorT

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接