2014/06/29

BeagleBoard-xM の USER ボタンでシャットダウンさせる方法

@ Ubuntu 13.10 (GNU/Linux 3.13.3-armv7-x10 armv7l)

私は、BeagleBoard-xM を MPD サーバとして使用しているのですが、キーボードもディスプレイも外してしまっています。
そのため、シャットダウンするためにはキーボードとディスプレイをつなぐか、SSH でログインしないといけません。
どっちにせよ、結構面倒くさいです。

というわけで、普段使われていない USER ボタンをシャットダウンボタンに変更してみました。
USER ボタン

/etc/init.d/user_button_shutdown.pl を作成
#!/usr/bin/perl

my $pid = fork;
die "$!" unless defined $pid;

my $comm = $ARGV[0];

if ($pid) {
  exit 0;
}

print $comm;
if ($comm ne "start") {
  exit 0;
}

open (INPUT, '/dev/input/event0') or die "$!";

my $inp = 0;
while( !($inp) ){
    read(INPUT, $inp, 1);
}
close(INPUT);

exec("poweroff");

exit 0;

起動時に実行されるようにする。
$ sudo chown root:root
$ sudo chmod 744
$ sudo update-rc.d user_button_shutdown.pl defaults
update-rc.d: warning: /etc/init.d/user_button_shutdown.pl missing LSB information
update-rc.d: see 
 Adding system startup for /etc/init.d/user_button_shutdown.pl ...
   /etc/rc0.d/K20user_button_shutdown.pl -> ../init.d/user_button_shutdown.pl
   /etc/rc1.d/K20user_button_shutdown.pl -> ../init.d/user_button_shutdown.pl
   /etc/rc6.d/K20user_button_shutdown.pl -> ../init.d/user_button_shutdown.pl
   /etc/rc2.d/S20user_button_shutdown.pl -> ../init.d/user_button_shutdown.pl
   /etc/rc3.d/S20user_button_shutdown.pl -> ../init.d/user_button_shutdown.pl
   /etc/rc4.d/S20user_button_shutdown.pl -> ../init.d/user_button_shutdown.pl
   /etc/rc5.d/S20user_button_shutdown.pl -> ../init.d/user_button_shutdown.pl

問題点

すごく雑に作ったので、 missing LSB information が出ちゃうけど、現実的には問題ないから放置しております…

あと、キーボード等がつながっていると、USR Switch が /dev/input/event1 や event2 に割り当てられてしまう問題が。
動的に確認する方法はないものだろうか?