私はbashを初めて使用し、aMaiaの回答のようにkworkerビジネスを無効にするスクリプトを作成しようとしています ここ 。
これまでのところ、これはルートから実行しています。
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
パーミッションと関係があると思います。 rootがデフォルトでこれらのファイルへの書き込みアクセス権を持っているとは思いません。 rootとして同じエラーが表示されたとしても、そのファイルに手動で「無効」にエコーしてみてください。したがって、スクリプトを機能させるには、エコーの前に$ iでchmod744を実行します。これでうまくいくはずです。
AlpineLinux環境のDockerでもこの問題が発生しました。問題は、echoがデフォルトで文字列の最後に改行文字を置き、カーネルがそれを受け入れないことだと思いますが、すべてのシステムに当てはまるわけではありません。 Dockerでこのエラーが発生しましたが、エラーメッセージにもかかわらず値が書き込まれました。
解決策(Bash):echo -n disable >/sys/firmware/acpi/interrupts/gpe66
。このように、改行はエコーされません。
すべてのスペルを再確認してください。 echo "disabled"は、rootに対しても書き込みエラーを発行しますが、echo "disable"は成功します。
すでに無効に設定されている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
#