質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.49%
sh

shは、UNIX系OSのシェル操作の1つであり、最も基本的なシェルのことです。

Raspberry Pi

Raspberry Piは、ラズベリーパイ財団が開発した、名刺サイズのLinuxコンピュータです。 学校で基本的なコンピュータ科学の教育を促進することを意図しています。

Q&A

解決済

1回答

2960閲覧

/etc/udev/rules.d/から呼び出されたスクリプトが強制終了される

NickName

総合スコア7

sh

shは、UNIX系OSのシェル操作の1つであり、最も基本的なシェルのことです。

Raspberry Pi

Raspberry Piは、ラズベリーパイ財団が開発した、名刺サイズのLinuxコンピュータです。 学校で基本的なコンピュータ科学の教育を促進することを意図しています。

0グッド

0クリップ

投稿2017/01/12 15:10

###前提・実現したいこと
raspberry pi 3 を利用して下記のようなシステムを構築しようとしております。
1.SDカード挿入時に/etc/udev/rules.dを利用して、2.のスクリプトが実行される
2.スクリプトの中でSDカードの中身を特定のディレクトリにコピー
3.ファイルリネームプログラム(JAVA:自作)呼び出し

この時、/etc/udev/rules.dによって呼び出されたスクリプトが途中で終了されてしまい、
コピー中や、リネーム中に処理が止まってしまいます。

###該当のソースコード
/etc/udev/rules.dに格納しているファイルは50-CardInMultiReader.rulesという名前で、
内容は下記のとおりです。

ACTION=="add",\ DRIVERS=="sd",\ ATTRS{model}=="Flash Reader "\ RUN:="/mnt/data/Systems/Scripts/sdcard_sync.sh"

/mnt/data/Systems/Scripts/sdcard_sync.shの中身は下記のとおりです

bash

1#!/bin/bash 2 3TO1_MAIL=test@example.com 4MSG_BACKUP_S="バックアップを開始しました" 5MSG_BACKUP_N="バックアップ可能なメディアではありませんでした" 6MSG_BACKUP_E="バックアップを完了しました" 7LOGF_PATH=/mnt/data/Share/Temp/targets/sdCopy.log 8 9if [[ "$DEVNAME" =~ sd[c-z][0-9] ]]; then 10 echo $MSG_BACKUP_S | mail -s "data backup" $TO1_MAIL 11else 12 exit 1 13fi 14 15echo pid=$$ >> $LOGF_PATH 16 17hoge=0 18while : 19do 20 sleep 1; echo `date` >> $LOGF_PATH 21 if [ $hoge -gt 3000 ] ; then 22 echo "over 3000" >> $LOGF_PATH 23 break 24 fi 25done 26#本来はここでファイルコピーとリネームスクリプトの呼び出し

###試したこと
上記の状態で、USBのカードリーダーのSDカードの抜き差しをした所、
sdCopy.logに下記の通りの出力があり、その後ログ出力が止まりました。

pid=12781 Fri Jan 13 00:06:10 JST 2017 Fri Jan 13 00:06:11 JST 2017 Fri Jan 13 00:06:12 JST 2017 Fri Jan 13 00:06:13 JST 2017 Fri Jan 13 00:06:14 JST 2017 Fri Jan 13 00:06:15 JST 2017 Fri Jan 13 00:06:16 JST 2017 Fri Jan 13 00:06:17 JST 2017 Fri Jan 13 00:06:18 JST 2017 Fri Jan 13 00:06:19 JST 2017 Fri Jan 13 00:06:20 JST 2017 Fri Jan 13 00:06:21 JST 2017 Fri Jan 13 00:06:22 JST 2017 Fri Jan 13 00:06:23 JST 2017 Fri Jan 13 00:06:24 JST 2017 Fri Jan 13 00:06:25 JST 2017 Fri Jan 13 00:06:26 JST 2017 Fri Jan 13 00:06:27 JST 2017 Fri Jan 13 00:06:28 JST 2017 Fri Jan 13 00:06:29 JST 2017 Fri Jan 13 00:06:30 JST 2017 Fri Jan 13 00:06:31 JST 2017 Fri Jan 13 00:06:32 JST 2017 Fri Jan 13 00:06:33 JST 2017 Fri Jan 13 00:06:34 JST 2017 Fri Jan 13 00:06:35 JST 2017 #このあとはログ出力がされなくなってしまう

この時のプロセスを監視してみた所、下記のような表記でした

Every 0.5s: ps auxw | grep sdcard_sync.sh Fri Jan 13 00:06:19 2017 pi 1367 1.6 0.2 3744 2304 pts/0 S+ 1月12 0:25 watch -n 0.5 -d ps auxw | grep sdcard_sync.sh root 12781 0.1 0.2 3496 2636 ? S 00:06 0:00 /bin/bash /mnt/data/Systems/Scripts/sdcard_sync.sh pi 12923 0.0 0.0 3740 276 pts/0 S+ 00:06 0:00 watch -n 0.5 -d ps auxw | grep sdcard_sync.sh pi 12924 0.0 0.0 1912 408 pts/0 S+ 00:06 0:00 sh -c ps auxw | grep sdcard_sync.sh pi 12926 0.0 0.2 3780 2004 pts/0 S+ 00:06 0:00 grep sdcard_sync.sh

###補足情報(言語/FW/ツール等のバージョンなど)
作業環境は以下のとおりです
Distributor ID: Raspbian
Description: Raspbian GNU/Linux 8.0 (jessie)
Release: 8.0
Codename: jessie

何をどう調べていくのが適当なのかがわからない状態です。
途中で止まってしまう原因の探し方、もしくは原因などご教示いただけましたら幸いです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

自己解決

申し訳ありません。
別の質問で回答をいただきました。

こちらは
http://unix.stackexchange.com/questions/28548/how-to-run-custom-scripts-upon-usb-device-plug-in/28711#28711
にあります通り、他のデーモンの処理を邪魔しないために、タイムアウトするのが仕様となっております。

したがって、ここで呼び出したスクリプト自体で処理を行うのではなく、atコマンドに渡して処理を行うのが正解です。

raspbianにはatコマンドがインストールされておりませんので、sudo apt-get install at で導入後、ご利用ください。

投稿2017/01/13 15:25

NickName

総合スコア7

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問