yp0915
@yp0915

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

カメラ画角の確認用でラズパイ起動後にffplayを自動起動させたい

解決したいこと

ラズパイとWebカメラで画像の定期撮影をやりたいと思っています。
そこで、ラズパイ起動時にカメラ画角を確認したく、ffplayを使用しています。
シェルスクリプトを作成し、Sysetemdで自動起動をやっているのですが、ffplayが立ち上がりません(立ち上がっているけど画面が表示されない?)。。。
解決方法を教えて下さい。

実施していること

①シェルスクリプトを作成
ffplayでカメラ画角を確認、1分後に自動終了

#!/bin/bash
timeout 60 ffplay -f v4l2 -i /dev/video0

②Systemdで自動実行
下記フォルダにserviseファイルとtimerファイルを作成
/etc/systemd/system

・serviseファイル

[Unit]
Description = check camera angle
[Service]
ExecStart = /home/user/Desktop/camera/test.sh
User = user
Group = user
[Install]
WantedBy = multi-user.target

・timerファイル

[Unit]
Description = check camera angle
[Timer]
OnBootSec = 3min
Unit = cap.service
[Install]
WantedBy = multi-user.target

発生している問題

SystemdのServiceファイルのステータスを確認すると、
timerファイルで指定した3分後にはエラーが発生していないように見えるのですが、シェルスクリプトの実施後、確認するとエラーが発生しております・・・
↓ちなみに、Sytemdを使わずに、シェルスクリプトのみの実行だと問題なく動作しています。

2023-11-02-131346_3840x2160_scrot.png

Serviceファイルの実行結果 ※ffplay起動中?

● cap.service - check camera angle
     Loaded: loaded (/etc/systemd/system/cap.service; enabled; vendor preset: e>
     Active: active (running) since Thu 2023-11-02 13:18:34 JST; 16s ago
TriggeredBy: ● cap.timer
   Main PID: 1547 (test.sh)
      Tasks: 11 (limit: 8695)
        CPU: 2.052s
     CGroup: /system.slice/cap.service
             ├─1547 /bin/bash /home/user/Desktop/camera/test.sh
             ├─1549 timeout 60 ffplay -f v4l2 -i /dev/video0
             └─1550 ffplay -f v4l2 -i /dev/video0

11月 02 13:18:35 raspberrypi test.sh[1550]: error: XDG_RUNTIME_DIR not set in t>
11月 02 13:18:36 raspberrypi test.sh[1550]: error: XDG_RUNTIME_DIR not set in t>
11月 02 13:18:37 raspberrypi test.sh[1550]: [4.0K blob data]
11月 02 13:18:37 raspberrypi test.sh[1550]:   Duration: N/A, start: 187.219201,>
11月 02 13:18:37 raspberrypi test.sh[1550]:     Stream #0:0: Video: rawvideo (Y>
11月 02 13:18:43 raspberrypi test.sh[1550]: [11.8K blob data]
11月 02 13:18:44 raspberrypi test.sh[1550]: [1.9K blob data]
11月 02 13:18:44 raspberrypi test.sh[1550]: [929B blob data]
11月 02 13:18:45 raspberrypi test.sh[1550]: [1.3K blob data]
11月 02 13:18:49 raspberrypi test.sh[1550]: [6.6K blob data]

Serviceファイルの実行結果 ※シェルスクリプトで指定した1分経った後
エラーがでている。。。

● cap.service - check camera angle
     Loaded: loaded (/etc/systemd/system/cap.service; enabled; vendor preset: enabled)
     Active: failed (Result: exit-code) since Thu 2023-11-02 13:19:35 JST; 1min 50s ago
TriggeredBy: ● cap.timer
    Process: 1547 ExecStart=/home/pi/Desktop/camera/test.sh (code=exited, status=124)
   Main PID: 1547 (code=exited, status=124)
        CPU: 3.119s

11月 02 13:18:37 raspberrypi test.sh[1550]:   Duration: N/A, start: 187.219201, bitrate: 199065 kb/s
11月 02 13:18:37 raspberrypi test.sh[1550]:     Stream #0:0: Video: rawvideo (YUY2 / 0x32595559), yuyv422, 1920x1080, 199065 kb/s, 6>
11月 02 13:18:43 raspberrypi test.sh[1550]: [11.8K blob data]
11月 02 13:18:44 raspberrypi test.sh[1550]: [1.9K blob data]
11月 02 13:18:44 raspberrypi test.sh[1550]: [929B blob data]
11月 02 13:18:45 raspberrypi test.sh[1550]: [1.3K blob data]
11月 02 13:18:49 raspberrypi test.sh[1550]: [6.6K blob data]
11月 02 13:19:35 raspberrypi systemd[1]: cap.service: Main process exited, code=exited, status=124/n/a
11月 02 13:19:35 raspberrypi systemd[1]: cap.service: Failed with result 'exit-code'.
11月 02 13:19:35 raspberrypi systemd[1]: cap.service: Consumed 3.119s CPU time.

Timerファイルの実行結果
こちらは問題ないかと。

● cap.timer - check camera angle
     Loaded: loaded (/etc/systemd/system/cap.timer; enabled; vendor preset: ena>
     Active: active (elapsed) since Thu 2023-11-02 13:15:21 JST; 4min 53s ago
    Trigger: n/a
   Triggers: ● cap.service

11月 02 13:15:21 raspberrypi systemd[1]: Started check camera angle.

お詳しい方、ご回答のほど、お願いいたいます。
不足している情報等ありましたら、コメントいただければと思います。

0

1Answer

timeoutコマンドの実行結果が124であることに対して、エラーとなっているように見えます。

11月 02 13:19:35 raspberrypi systemd[1]: cap.service: Main process exited, code=exited, status=124/n/a
11月 02 13:19:35 raspberrypi systemd[1]: cap.service: Failed with result 'exit-code'.

なので、邪道ですが、test.shに以下を追加されてはいかがでしょうか?

STATUS=$?
if [ "$STATUS" -eq 124 ];
then
 exit 0
fi

1Like

Comments

  1. @yp0915

    Questioner

    @jinbei230525 さま
    ご回答ありがとうございます。
    上記を追加してみました。

    test.sh
    '''
    #!/bin/bash

    STATUS=$?
    if [ "$STATUS" -eq 124 ];
    then
     exit 1
    fi

    timeout 300 ffplay -f v4l2 -i /dev/video0

    '''

    systemdで確認したところ、エラーが変わっていないようにみえます・・・

    serviceファイルのstatus確認結果
    '''
    ● cap.service - check camera angle
    Loaded: loaded (/etc/systemd/system/cap.service; enabled; vendor preset: enabled)
    Active: failed (Result: exit-code) since Thu 2023-11-02 14:50:54 JST; 8min ago
    TriggeredBy: ● cap.timer
    Process: 372 ExecStart=/home/pi/Desktop/camera/test.sh (code=exited, status=124)
    Main PID: 372 (code=exited, status=124)
    CPU: 25.871s

    11月 02 14:49:45 raspberrypi test.sh[411]: [47.9K blob data]
    11月 02 14:50:10 raspberrypi test.sh[411]: [48.0K blob data]
    11月 02 14:50:27 raspberrypi test.sh[411]: [33.7K blob data]
    11月 02 14:50:27 raspberrypi test.sh[411]: [860B blob data]
    11月 02 14:50:28 raspberrypi test.sh[411]: [791B blob data]
    11月 02 14:50:52 raspberrypi test.sh[411]: [47.9K blob data]
    11月 02 14:50:54 raspberrypi test.sh[411]: [3.3K blob data]
    11月 02 14:50:54 raspberrypi systemd[1]: cap.service: Main process exited, code=exited, status=124/n/a
    11月 02 14:50:54 raspberrypi systemd[1]: cap.service: Failed with result 'exit-code'.
    11月 02 14:50:54 raspberrypi systemd[1]: cap.service: Consumed 25.871s CPU time.

    '''

    あとは、Timerファイルで起動して3分後に実行としているのですが、Activeの時間をみるとラズパイ起動時に実行されているように見えます。。。 
    これが悪さをしているのかもしれないです・・・(ラズパイ起動時のブラックアウト画面のときに実行されている可能性?)

  2. 失礼、全部シェルスクリプトを書くべきでした。

    #!/bin/bash
    
    timeout 300 ffplay -f v4l2 -i /dev/video0
    
    STATUS=$?
    if [ "$STATUS" -eq 124 ];
    then
     exit 0
    fi
    
    

    こうすると、どうでしょうか?

  3. @yp0915

    Questioner

    @jinbei230525 さま

    すみません・・・
    ありがとうございます。

    変更して実行してみました。Status127に変わりました。

    ● cap.service - check camera angle
    Loaded: loaded (/etc/systemd/system/cap.service; enabled; vendor preset: enabled)
    Active: failed (Result: exit-code) since Thu 2023-11-02 15:11:56 JST; 47s ago
    TriggeredBy: ● cap.timer
    Process: 405 ExecStart=/home/pi/Desktop/camera/test.sh (code=exited, status=127)
    Main PID: 405 (code=exited, status=127)
    CPU: 3.408s

    11月 02 15:11:30 raspberrypi test.sh[442]: error: XDG_RUNTIME_DIR not set in the environment.
    11月 02 15:11:32 raspberrypi test.sh[442]: [4.3K blob data]
    11月 02 15:11:32 raspberrypi test.sh[442]: Duration: N/A, start: 14.515746, bitrate: 199065 kb/s
    11月 02 15:11:32 raspberrypi test.sh[442]: Stream #0:0: Video: rawvideo (YUY2 / 0x32595559), yuyv422, 1920x1080, 199065 kb/s, 6 fps, 6 tbr, 1000k tbn, 1000k tbc
    11月 02 15:11:48 raspberrypi test.sh[442]: [32.3K blob data]
    11月 02 15:11:56 raspberrypi test.sh[442]: [16.7K blob data]
    11月 02 15:11:56 raspberrypi test.sh[1153]: /home/pi/Desktop/camera/test.sh: 行 8:  exit: コマンドが見つかりません
    11月 02 15:11:56 raspberrypi systemd[1]: cap.service: Main process exited, code=exited, status=127/n/a
    11月 02 15:11:56 raspberrypi systemd[1]: cap.service: Failed with result 'exit-code'.
    11月 02 15:11:56 raspberrypi systemd[1]: cap.service: Consumed 3.408s CPU time.

  4. ・timerファイルのOnBootSecを4minにして、test.shは最初のバージョンで実行してみるといかがでしょうか?

    OnBootSec = 4min

    timeoutコマンドの実行が正常終了してないことが原因のように思えてきました。

  5. @yp0915

    Questioner

    @jinbei230525 さま

    ありがとうございます。
    上記で実行してみましたが、同様のエラーのようです。。。

    ● cap.service - check camera angle
    Loaded: loaded (/etc/systemd/system/cap.service; enabled; vendor preset: enabled)
    Active: failed (Result: exit-code) since Thu 2023-11-02 15:38:10 JST; 13s ago
    TriggeredBy: ● cap.timer
    Process: 385 ExecStart=/home/user/Desktop/camera/test.sh (code=exited, status=124)
    Main PID: 385 (code=exited, status=124)
    CPU: 28.827s

    11月 02 15:36:47 raspberrypi test.sh[399]: [3.5K blob data]
    11月 02 15:36:48 raspberrypi test.sh[399]: [860B blob data]
    11月 02 15:36:52 raspberrypi test.sh[399]: [9.8K blob data]
    11月 02 15:37:15 raspberrypi test.sh[399]: [47.9K blob data]
    11月 02 15:37:38 raspberrypi test.sh[399]: [48.0K blob data]
    11月 02 15:38:01 raspberrypi test.sh[399]: [48.0K blob data]
    11月 02 15:38:10 raspberrypi test.sh[399]: [16.4K blob data]
    11月 02 15:38:10 raspberrypi systemd[1]: cap.service: Main process exited, code=exited, status=124/n/a
    11月 02 15:38:10 raspberrypi systemd[1]: cap.service: Failed with result 'exit-code'.
    11月 02 15:38:10 raspberrypi systemd[1]: cap.service: Consumed 28.827s CPU time.

    test.shのtimeoutコマンドなしでやってみると、下記のようにエラーはでていないですが、ウィンドウが立ち上がりません・・・
    やはり、activeを確認(7min ago)すると、起動時間はTimerファイルで指定したマシン起動から4分後ではなく、マシン起動後に実行されてしまっています・・・

    ● cap.service - check camera angle
    Loaded: loaded (/etc/systemd/system/cap.service; enabled; vendor preset: e>
    Active: active (running) since Thu 2023-11-02 15:49:18 JST; 7min ago
    TriggeredBy: ● cap.timer
    Main PID: 390 (test.sh)
    Tasks: 10 (limit: 8695)
    CPU: 36.435s
    CGroup: /system.slice/cap.service
    ├─390 /bin/bash /home/pi/Desktop/camera/test.sh
    └─411 ffplay -f v4l2 -i /dev/video0

    11月 02 15:56:37 raspberrypi test.sh[411]: [471B blob data]
    11月 02 15:56:37 raspberrypi test.sh[411]: Failed to create scanout resource
    11月 02 15:56:37 raspberrypi test.sh[411]: [471B blob data]
    11月 02 15:56:37 raspberrypi test.sh[411]: Failed to create scanout resource
    11月 02 15:56:38 raspberrypi test.sh[411]: [471B blob data]
    11月 02 15:56:38 raspberrypi test.sh[411]: Failed to create scanout resource
    11月 02 15:56:38 raspberrypi test.sh[411]: [471B blob data]
    11月 02 15:56:38 raspberrypi test.sh[411]: Failed to create scanout resource
    11月 02 15:56:40 raspberrypi test.sh[411]: [5.4K blob data]
    11月 02 15:56:42 raspberrypi test.sh[411]: [3.4K blob data]

  6. @yp0915 test.shのシェルスクリプトを以下のようにしてみました。こちらで実行するとどうでしょうか?

    test.sh
    
    #!/bin/bash
    
    timeout 300 ffplay -f v4l2 -i /dev/video0
    
    STATUS=$?
    if [ "$STATUS" -ne 0 ];
    then
     exit 0
    fi
    
  7. @yp0915

    Questioner

    @jinbei230525 さま

    ありがとうございます。
    上記ファイルをtimerファイルで指定した起動4分後に実行してみました。
    実行中は、ウィンドウが立ち上がることなく、shファイルで指定した5分後に確認すると、下記エラーが発生していました。

    ● cap.service - check camera angle
         Loaded: loaded (/etc/systemd/system/cap.service; enabled; vendor preset: enabled)
         Active: failed (Result: exit-code) since Mon 2023-11-06 09:57:41 JST; 4min 51s ago
    TriggeredBy: ● cap.timer
        Process: 397 ExecStart=/home/user/Desktop/camera/test.sh (code=exited, status=127)
       Main PID: 397 (code=exited, status=127)
            CPU: 23.333s
    
    11月 06 09:56:44 raspberrypi test.sh[442]: [19.1K blob data]
    11月 06 09:56:48 raspberrypi test.sh[442]: [7.3K blob data]
    11月 06 09:56:48 raspberrypi test.sh[442]: [1.2K blob data]
    11月 06 09:57:00 raspberrypi test.sh[442]: [23.4K blob data]
    11月 06 09:57:01 raspberrypi test.sh[442]: [2.0K blob data]
    11月 06 09:57:05 raspberrypi test.sh[442]: [6.1K blob data]
    11月 06 09:57:41 raspberrypi test.sh[1803]: /home/user/Desktop/camera/test.sh: 行 8:  exit: コマンドが見つかりません
    11月 06 09:57:41 raspberrypi systemd[1]: cap.service: Main process exited, code=exited, status=127/n/a
    11月 06 09:57:41 raspberrypi systemd[1]: cap.service: Failed with result 'exit-code'.
    11月 06 09:57:41 raspberrypi systemd[1]: cap.service: Consumed 23.333s CPU time.
    

    ちなみに、10回に1回ほど、マシン起動後にウィンドウが立ち上がっていることがあります。
    原因はよく分かりませんが・・・
    (やはりtimerファイルでマシン起動4分後にtest.sh起動を指定していますが、マシン起動後に実行されている? 起動時にウィンドウが立ち上がるのでもOKなのですが、毎回立ち上がるわけではないので、なぜかなと・・・)

Your answer might help someone💌