2014年3月13日木曜日

Qtにおけるビルドファイルの出力先

Qtのmakeファイルの出力先は、プロジェクトモードにして、ビルドディレクトリ欄に記述する。
Debug/Releaseそれぞれについて指定する必要がある。
("ビルド構成を編集"のリストボックスで選択可能)


BBBでQtアプリの自動起動

目的

Qtを使用してBBB上でGUIアプリを動作させる。
GUIアプリではKeyPressEventを使用してキーボードの入力値を取得している
GUIアプリはBBBの電源投入で自動起動させる

環境

BeagleBoneBlack + AngStrom(3.8) + Qt(5.1)
# uname -a
Linux beaglebone 3.8.13 #1 SMP Wed Aug 14 16:25:00 CEST 2013 armv7l GNU/Linux

Qt Window Systemを使用する為、XServerを無効化しておく。

BOOT時にXServerを無効化してCUIモードで起動する
# systemctl disable gdm.service

XServerはsystemdで管理されているので、GUIモード中にCUIモードにしたい場合
# systemctl stop gdm.service

Xserverをまた立ち上げたい場合
# systemctl enable gdm.service

オートログイン化の為に、以下のサービスを編集している。
/etc/systemd/system/getty.target.wants/serial-getty@tty1.service
#ExecStart=-/sbin/agetty --noclear %I 38400 linux
ExecStart=-/sbin/agetty -a root %I 38400 linux

試行

【1】telnetでログインしてQt-GUIアプリを起動

・ウィンドウ生成 成功
・ログファイル出力 成功
・仮想キーボード・LCD4ボタン共に反応せず


【2】BOOT1時のsystemdによる自動起動

・ウィンドウ生成 成功
・ログファイル出力 成功
・仮想キーボード・LCD4ボタン共に反応せず
・init.dによる起動も試みたが同様

【3】USBキーボードを接続してログイン、Qt-GUIアプリを手動起動

・ウィンドウ生成 成功
・ログファイル出力 成功
 仮想キーボード・LCD4ボタン共に反応せず

考察

BBBに直ログインした場合、端末名はtty1。
telnetでログインした場合、端末名はttyO0。
systemdで自動起動した場合、端末名は"?"("ps ax"コマンドで確認)
tty1からアプリを起動しないとキーボードを取得出来ないらしい。
systemdによる起動は、ログインプロンプトに先駆けて行われるので端末と結び付けられていない。
なのでログイン後にアプリを自動起動する必要があるが、.bashrcや.bash_profileはAngstromでは機能しない。

対策

ログインプロンプトはsystemdによって管理されるサービスによって実行され、コマンドはagettyが使用される。
agettyは、ログインの方法に標準の"/bin/login"の代わりに独自のプログラムをroot権限で実行する"-l"オプションが存在する。
これを利用して、アプリの起動→終了後に/bin/loginを実行するスクリプトをagettyから読み出す。

/etc/systemd/system/getty.target.wants/serial-getty@tty1.service
[Service]
ExecStart=-/sbin/agetty -l /home/root/MyApp.sh -a root %I 38400 linux

/home/root/MyApp.sh
#!/bin/bash

/home/root/MyApp -qws
/bin/login root

参考文献

man of agetty
Linux起動の仕組みを理解しよう[rcスクリプト編]
Automatic login on Angstrom Linux
Systemd入門(1) - Unitの概念を理解する
自作プログラムをデーモンとして起動させる(by init.d)
systemdの*.serviceファイルの書き方

Create Startup Script in Angstrom
Automatic login on Angstrom Linux

BeagleBone Black(Angstrom)にSSHで入れるようにする

Qt4 自前のsignalの作り方
Qt Events

.bashrc と .bash_profile 結局どっちを使えばいい?

2014年3月10日月曜日

【Linux】他のユーザをログアウト

Telnet(ttyO1)からログインして、直接続(tty1)にログインしているユーザをキックする。

who
 01:16:23 up  1:16,  2 users,  load average: 0.10, 0.08, 0.05
USER     TTY        LOGIN@   IDLE   JCPU   PCPU WHAT
root     ttyO0     00:06    7.00s  0.22s  0.04s w
root     tty1      00:07    1:08m  0.64s  0.57s ./ViEditView -qws

tty1が関わるプロセスを表示する

ps ax | grep tty1
  185 tty1     Ss     0:00 /bin/login --                 
  410 tty1     S      0:00 -sh
  411 tty1     S+     0:00 ./ViEditView -qws
  443 ttyO0    S+     0:00 grep tty1

ここで、tty1のログインに関わるプロセスIDは410。これにkillシグナルを送る

kill -9 410

再度whoコマンドを実行し、tty1ユーザがいなくなっている事を確認する

who
root     ttyO0        Jan  1 00:06

■参考文献
不要なユーザを強制ログアウトさせる
【 kill 】 プロセスおよびジョブを強制終了する
【 who 】 現在ログインしているユーザーを表示する