ラズパイOS書き込み

ラズパイOS書き込み

M1MacbookAir で
Raspberry Pi Imager
を使い
OSを microSD へ書き込み

https://www.raspberrypi.com/software/
からダウンロード

以前はNOOBSから簡単にダウンロードして
インストールだったけど
今はこの方法が公式らしい

https://gadget-live.net/raspberry-pi-zero-drive-recorder/

Raspberry Pi Zeroの対応フォーマット的にmicroSDHC規格しか使えないため、容量は基本的に最大32GB
とあったので
Raspberry Pi Zero 64gb
で調べたら

https://pentan.info/rp/microsd_capacity.html
によれば最大容量は512GBまで大丈夫らしい

Raspberry Pi Zero、1および2で使用されているSoCのバージョンには
制約があるため、SDカードのパーティションサイズの制限は256GBです
とのこと

そういえば初期設定で色々Wi-Fiとか設定できるらしいので
これを調べる

Raspberry Pi Imager アップデート! イメージ書き込みと同時にWiFi やSSH 接続が設定できるようになりました! #RaspberryPi
によればWi-Fiの設定が可能
なお Mac から行うとキーチェーンを使って
そのまま設定ができた

またタイムゾーンの設定も可能だったのでしておく

公開鍵の設定が分かりにくかったので検索

ラズパイ(Raspberry Pi 4 Model B)をSSDブートにする(備忘録)

によれば
まず公開鍵ファイルを作成し
.pub の公開鍵ファイルの中身をコピペすればOKらしい

とりあえず作成するけど
ファイル名を分けないと分かりにくいので
https://www.ni4.jp/2021/01/31-134600.html
を参考に
-f オプションをつけてファイル名を指定する

cd .ssh 
ssh-keygen -t rsa -f id_rsa_pizero

で作成

なお
-C “”
をつけると
作成時の自分の情報を削除できるらしい

作成後

cat id_rsa_pizero

でファイルの中身を表示し
これをコピペすれば完成

Mac で音声認識 pyttsx3

Mac で音声認識

Python で音声認識をする

Pythonで日本語を音声認識をして音声をテキスト化し、それを音声合成して発音する方法簡単解説【オウム返し by Mac その1:音声認識編】
を参考に

pip install speechrecognition

でインストール

import subprocess
import tempfile
 
 
# 音声入力
while True:
    r = sr.Recognizer()
    with sr.Microphone() as source:
        print("何かお話しして下さい。")
        audio = r.listen(source)
 
    try:
        # Google Web Speech APIで音声認識
        text = r.recognize_google(audio, language="ja-JP")
    except sr.UnknownValueError:
        print("Google Web Speech APIは音声を認識できませんでした。")
    except sr.RequestError as e:
        print("GoogleWeb Speech APIに音声認識を要求できませんでした;"
              " {0}".format(e))
    else:
        print(text)
    if text == "終わりだよ":
        break
print("完了。")

Mic,py

として実行したけど

Traceback (most recent call last):
  File "/Users/snowpool/mic.py", line 7, in <module>
    r = sr.Recognizer()
NameError: name 'sr' is not defined. Did you mean: 'str'?

となる

pip install Pyaudio

を実行したが

Building wheel for Pyaudio (pyproject.toml) ... error
  error: subprocess-exited-with-error
  
  × Building wheel for Pyaudio (pyproject.toml) did not run successfully.
  │ exit code: 1
  ╰─> [18 lines of output]
      running bdist_wheel
      running build
      running build_py
      creating build
      creating build/lib.macosx-12.5-arm64-cpython-310
      creating build/lib.macosx-12.5-arm64-cpython-310/pyaudio
      copying src/pyaudio/__init__.py -> build/lib.macosx-12.5-arm64-cpython-310/pyaudio
      running build_ext
      building 'pyaudio._portaudio' extension
      creating build/temp.macosx-12.5-arm64-cpython-310
      creating build/temp.macosx-12.5-arm64-cpython-310/src
      creating build/temp.macosx-12.5-arm64-cpython-310/src/pyaudio
      clang -Wno-unused-result -Wsign-compare -Wunreachable-code -DNDEBUG -g -fwrapv -O3 -Wall -I/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include -I/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include -DMACOS=1 -I/usr/local/include -I/usr/include -I/opt/homebrew/include -I/Users/snowpool/.pyenv/versions/3.10.6/include/python3.10 -c src/pyaudio/device_api.c -o build/temp.macosx-12.5-arm64-cpython-310/src/pyaudio/device_api.o
      src/pyaudio/device_api.c:9:10: fatal error: 'portaudio.h' file not found
      #include "portaudio.h"
               ^~~~~~~~~~~~~
      1 error generated.
      error: command '/usr/bin/clang' failed with exit code 1
      [end of output]
  
  note: This error originates from a subprocess, and is likely not a problem with pip.
  ERROR: Failed building wheel for Pyaudio
Failed to build Pyaudio
ERROR: Could not build wheels for Pyaudio, which is required to install pyproject.toml-based projects

となる

PythonのSpeechRecognitionでマイク録音と文字起こしを簡単実装
を参考に

brew install portaudio

のあと

pip install PyAudio

でインストール成功

しかし

pip install speech_recognition

を実行すると

ERROR: Could not find a version that satisfies the requirement speech_recognition (from versions: none)
ERROR: No matching distribution found for speech_recognition

となる

とりあえず

Mkdir test_cpt
Cd test_gpt
Vim mic.py

として

import speech_recognition as sr

r = sr.Recognizer()
with sr.Microphone() as input:
    print("録音中:")
    audio = r.listen(input)

で保存し

Python mic.py

を実行すれば
録音中
と表示された

あとは

text = r.recognize_google(audio, language='ja-JP')

として
録音したデータをrecognize_google関数の引数に与えるだけ
第二引数のlanguageを変えれば英語とか他の言語として文字起こしできるらしい

入れる場所がいまいちわからんので
音声入力で文章作成するアプリの作り方【Python】

を参考にやってみる

Python】音声認識ライブラリのSpeechRecognitionでサクッと文字起こし
を参考に

もう少しやりやすく実際にマイクの認識と文字列かだけにしたいので

# micro.py

import speech_recognition as sr

for index, name in enumerate(sr.Microphone.list_microphone_names()):
    print("Microphone with name \"{1}\" found for `Microphone(device_index={0})`".format(index, name))

の実行結果は

Microphone with name "MacBook Airのマイク" found for `Microphone(device_index=0)`
Microphone with name "MacBook Airのスピーカー" found for `Microphone(device_index=1)`

これをもとに

# voice_test.py

import speech_recognition as sr

r = sr.Recognizer()

with sr.Microphone(device_index=0) as source:
    print('録音中: ')
    audio = r.listen(source)

try:
    text = r.recognize_google(audio, language='ja-JP')
    print(text)
except:
    print("録音されていません")

を実行

しかし
録音されていません
となる

# voice_test.py

import speech_recognition as sr

r = sr.Recognizer()

with sr.Microphone(device_index=0) as source:
    print('録音中: ')
    audio = r.listen(source)

try:
    text = r.recognize_google(audio, language='ja-JP')
    print(text)

    # 録音された音声をファイルへ保存
    with open("record.wav", "wb") as f:
        f.write(audio.get_raw_data())
except:
    print("録音されていません")

でテキストにできるらしいけど
そもそもマイクを認識していない?

参考サイトはwin10
Mac での動いているのを探す

Pythonで日本語を音声認識をして音声をテキスト化し、それを音声合成して発音する方法簡単解説【オウム返し by Mac その1:音声認識編】
を参考に

import speech_recognition as sr
import subprocess
import tempfile
 
 
# 音声入力
while True:
    r = sr.Recognizer()
    with sr.Microphone() as source:
        print("何かお話しして下さい。")
        audio = r.listen(source)
 
    try:
        # Google Web Speech APIで音声認識
        text = r.recognize_google(audio, language="ja-JP")
    except sr.UnknownValueError:
        print("Google Web Speech APIは音声を認識できませんでした。")
    except sr.RequestError as e:
        print("GoogleWeb Speech APIに音声認識を要求できませんでした;"
              " {0}".format(e))
    else:
        print(text)
    if text == "終わりだよ":
        break
print("完了。")

を実行したけど

Traceback (most recent call last):
  File "/Users/snowpool/test_gpt/voice_text.py", line 15, in <module>
    text = r.recognize_google(audio, language="ja-JP")
  File "/Users/snowpool/.pyenv/versions/3.10.6/lib/python3.10/site-packages/speech_recognition/__init__.py", line 879, in recognize_google
    flac_data = audio_data.get_flac_data(
  File "/Users/snowpool/.pyenv/versions/3.10.6/lib/python3.10/site-packages/speech_recognition/__init__.py", line 495, in get_flac_data
    flac_converter = get_flac_converter()
  File "/Users/snowpool/.pyenv/versions/3.10.6/lib/python3.10/site-packages/speech_recognition/__init__.py", line 1744, in get_flac_converter
    raise OSError("FLAC conversion utility not available - consider installing the FLAC command line application by running `apt-get install flac` or your operating system's equivalent")
OSError: FLAC conversion utility not available - consider installing the FLAC command line application by running `apt-get install flac` or your operating system's equivalent

となる

OSError: FLAC conversion utility not available - consider installing the FLAC command line application by running `apt-get install flac` or your operating system's equivalent

で検索したら

音声データをテキスト変換 / Speech to Text / Python
によれば
Flac が必要らしい

https://xiph.org/flac/download.html
で調べて

FLAC tools for OS X from Homebrew.
で検索
https://formulae.brew.sh/formula/flac

brew install flac

でインストール

import speech_recognition as sr

r = sr.Recognizer()
with sr.Microphone() as input:
    print("録音中:")
    audio = r.listen(input)
text = r.recognize_google(audio, language='ja-JP')
print(text)

として保存

これで再度実行すると

result2:
{   'alternative': [   {'confidence': 0.77176797, 'transcript': 'チャート GPT'},
                       {'transcript': 'チャート jpg'},
                       {'transcript': 'チャート jpt'},
                       {'transcript': 'チャート gpd'},
                       {'transcript': 'じゃあ と jpg'}],
    'final': True}
チャート GPT

となり
音声の認識とテキストにすることができた

次に

import speech_recognition as sr

r = sr.Recognizer()

with sr.Microphone(device_index=0) as source:
    print('録音中: ')
    audio = r.listen(source)

try:
    text = r.recognize_google(audio, language='ja-JP')
    print(text)

    # 録音された音声をファイルへ保存
    with open("record.wav", "wb") as f:
        f.write(audio.get_raw_data())
except:
    print("録音されていません")
を
voice_rec.py

として実行

これでマイクの音声のファイル化ができた

https://dev.classmethod.jp/articles/pyenv-command-not-found/
を参考に

brew unlink pyenv && brew link pyenv

したけど
Notebook が起動しない….

JupyterLabとJupyter Notebookの違いを簡単に解説【Mac】

https://miyukimedaka.com/2020/06/07/0143-jupyterlab-explanation/
を参考に

pip install jupyterlab


インストール

 jupyter lab

で起動

!pip install pyttsx3
import pyttsx3

engine = pyttsx3.init()
engine.say("音声読み上げライブラリ")
engine.runAndWait()

を実行したら日本語の読み上げができた

M1mac へmetasploitableインストール

M1mac へmetasploitableインストール

https://dev.to/merlos/how-to-setup-metasploitable-in-a-mac-with-m1-chip-44ph
を参考に

既にUTMはインストール済みなので
https://app.vagrantup.com/rapid7
へアクセスし
metasploitable3-ub1404
をダウンロードする

ダウンロードするのは
Virtual box のファイル

そのままだとわかりにくいので

Cd Download
mv 383cc30c-ae33-481e-b8e6-d0831964d33c metasploitable3-ub1404.zip

でファイル名変更

unzip metasploitable3-ub1404.zip

で解凍

しかし

Archive:  metasploitable3-ub1404.zip
  End-of-central-directory signature not found.  Either this file is not
  a zipfile, or it constitutes one disk of a multi-part archive.  In the
  latter case the central directory and zipfile comment will be found on
  the last disk(s) of this archive.
unzip:  cannot find zipfile directory in one of metasploitable3-ub1404.zip or
        metasploitable3-ub1404.zip.zip, and cannot find metasploitable3-ub1404.zip.ZIP, period.

となる

とりあえず解凍は
Gzip で解凍して
Tar コマンドで展開することで解決

次に
Qemu のインストール

brew install qemu

でOK

これは brew で簡単にインストールできるが時間が2時間ほどかかった

次に

cd Downloads
cd metasploitable3-ub1404

で対象ディレクトリに移動し

qemu-img convert -O qcow2 -c ./metasploitable3-ub1404-disk001.vmdk ./metasploitable3-ub1404-disk001.qcow2

を実行し変換

次にUTM 起動

仮想マシンを作成
をクリック

エミュレートをクリック

OSはその他を選択

ISO 起動をスキップ
にチェックを入れる

メモリを
1024 に変更する

データ保存ドライブは20GBに設定

あとはそのまま続けていき
仮想マシンの設定で
QEMU で
UEFI起動のチェックを外す

次にIDEドライブ
をクリックし
ドライブを削除
をクリック

これで消去されるので
ドライブの新規をクリック

読み込むをクリックし

metasploitable3-ub1404-disk001.qcow2
を選択

これで保存すれば起動できる

ログインユーザとパスワードは
デフォルトは vagrant になっている

M1Mac で UTM で仮想マシンを起動

M1Mac で UTM で仮想マシンを起動

UTMを使ってm1 macにKaliLinuxの仮想環境を構築する話

を参考に行ったが
Utm を
https://mac.getutm.app/
からダウンロード

https://www.kali.org/get-kali/#kali-installer-images
から
Kali linux をダウンロードしたが
Weekly
Installer
ともに黒い画面のままになる

参考サイトを変更

M1 mac で Windows11を : 無償のUTM (準備編)
を参考に行う

Brew は以前にインストール済み

brew install aria2

を実効

aria2 はマルチプロトコルのダウンローダ

しかし変わらない

次に
Graphical installを選択すると画像のような『_』が点滅している画面から動かなくなってしまいます

によれば
https://www.youtube.com/watch?v=WHlZEU5ejek&t=247s
にあるように
When I selected “Graphical Install” I ended up with a black screen and blinking cursor. I needed to make two changes. 1) Under the Kali Linux launcher in the left panel select “Edit” and goto “Display”. Change to “Console Only”. Save. 2) When you “Run” choose the “Install” option and NOT the “Graphical Install”

って書いてあるけど
最新のUTM だと
https://docs.getutm.app/guides/kali/#black-screen-on-start
に載っているように
仮想マシンの編集で
デバイス > 新規. > シリアル
とすることで
ターミナル画面が一緒に起動するようになり
インストールする時に
Install
というコマンドラインで行う方で立ち上げすればできる

ラズパイドラレコ作成

ラズパイドラレコ作成

ssh
でアクセスし

sudo apt-get update
sudo apt-get upgrade

のあと

sudo raspi-config


最初のメニューの5番目の項目、Interfacing Optionsを開くと1番上にカメラの項目があるのでこれを有効化

ここまでできたら

v4l2-ctl --list-devices

使用するカメラのデバイスファイルを調べる
通常は

/dev/video0

となる

デバイスファイルを特定しておくと、下記のコマンドでサポートしている動画のフォーマットを表示することが可能

v4l2-ctl -d /dev/video0 --list-formats

ラズパイで動画を撮影する方法として、FFmpegを使用してリアルタイムでハードウェアエンコードする方法がよく紹介されていますが、特にRaspberry Pi Zeroだとフレームレートがあまり出ないのでドラレコには不向き

しかしハードウェアエンコードなんてしなくても、H.264をサポートしているカメラモジュールを使用すれば、専用の動画撮影コマンドraspividを実行することで簡単にH.264動画を撮影することが可能

安価なUSB接続のWebカメラだとH.264をサポートしていなかったりしますが、私が確認した限りではラズパイ向けのカメラモジュールはどれもH.264をサポートしているので、基本的にraspividで録画することをおすすめ

raspividで動画を撮影するには
もっともシンプルに書くなら、-oで出力ファイル名のみを指定してこのように記述
なお指定した名前のファイルが既に存在する場合は実行に失敗するので注意

raspivid -o test.h264

このように何も指定せずに実行すると5秒の動画ファイルが生成される

拡張子がH.264と扱いにくい形式ですが、一応このままでもVLCなどの動画プレーヤーで再生することが可能 

撮影してみてカメラの向きが上下反転していた場合は-vf、左右反転していた場合は-hfを付け加えることで正常な向きに補正されるはず

また-rotで角度を指定して回転させることもできる

raspivid -o test.h264 -rot 180

正しい方向で撮影できるようになったら-wと-hで解像度、-tで撮影時間、-fpsでフレームレート、-bでビットレートを指定

raspivid -o test.h264 -rot 180 -w 1280 -h 720 -t 10000 -fps 30 -b 2000000

撮影時間はミリ秒で指定するため、-t 10000だと10秒の動画を生成

ただし-t 0で時間を指定しなければずっと録画し続けることが可能

Ctrl+Cで録画を停止

解像度やビットレートを上げれば高画質な動画を撮影できますが、それに比例してファイルサイズも大きくなるので注意

raspividの実行中にWi-Fiから切断されるとコマンドラインが閉じられるために録画も停止してしまう
車内にWi-Fi環境が整っている場合はともかく、そうでないならもう一工夫が必要

Raspberry Pi Zeroがネットワークから切断されてもraspividを停止しないようにするために、まずコマンドを実行するシェルスクリプトを作成

sudo nano test.sh

中身は

#!/bin/sh

raspivid -o `date '+%Y%m%d-%H%M'`.h264 \
-rot 180 -w 1280 -h 720 -t 10000 -fps 30 -b 2000000

あとは

sh test.sh

で録画できればok

次は
作成したスクリプトをサービスとしてシステム管理デーモンのsystemdに登録

まずは自動実行させたいスクリプトを/optに作成

sudo nano /opt/test.sh

今回は録画時間を指定しない

#!/bin/sh

raspivid -o `date '+%Y%m%d-%H%M'`.h264 \
-rot 180 -w 1280 -h 720 -t 0 -fps 30 -b 2000000

次は

sudo chmod 0755 /opt/test.sh

で実行権限付与

このスクリプトをサービスとしてsystemdに登録するため、ユニットファイルを作成

sudo nano /etc/systemd/system/test.service

中身は

[Unit]
Description = test

[Service]
ExecStart = /opt/test.sh
Restart = always
Type = simple

[Install]
WantedBy = multi-user.target

解説
Descriptionはユニットファイルの説明です。これは自由に記述

ExecStartに登録したいスクリプトを記述

Restartはalwaysを設定しておくことで、プロセスが不意に終了しても再起動させることが可能です。再起動する条件として異常終了した場合のみ、あるいは逆に正常終了した場合のみなどを設定することも可能ですが、通常はalwaysで良い

例外として後述するsystemctlコマンドで停止した場合のみ再起動されない

Typeはプロセスの起動タイプを設定するオプションです。simpleがデフォルトで、メインプロセスとして登録

WantedByは弱く依存するユニットを記述します。噛み砕いて説明すると、multi-user.targetの起動時にtest.serviceの起動も試みてほしい、ということです。多くのサービスがmulti-user.targetに紐付いていて、OS起動時にまとめて実行されます。

ユニットを定義できたら、サービスを有効化するために下記のコマンドを実行

sudo systemctl enable test.service

正常に有効化されていれば、下記のコマンドを入力するとバックグラウンドでサービスが実行されます。

サービスの状態は下記のコマンドで確認

sudo systemctl status test.service

しかし

Loaded: loaded (/etc/systemd/system/test.service; enabled; vendor preset: > Active: inactive (dead)

と表示されて固まる

Systemd を利用してサービスを追加・登録する

を参考に

systemctl list-unit-files --type=service |grep test

を実行し

glamor-test.service                        enabled         enabled
gldriver-test.service                      enabled         enabled
test.service                               enabled         enabled

で稼働しているのを確認

またサービスを手動で停止したい場合は下記のコマンドを実行

sudo systemctl stop test.service

とりあえず止めておく
理由は

ただし普通にraspividコマンドを実行すると1つの巨大な動画ファイルが生成されてしまうので、特にWi-Fi経由でデータを取り出そうとするとかなり時間がかかります

解決策として
FFmpegへパイプ入力して動画ファイルの分割&変換処理を自動的に実行させることで対策

https://gadget-live.net/raspberry-pi-raspivid-ffmpeg-pipe-input/
を参考に

あとは
Raspberry Pi Zeroをシャットダウンして安全に電源を切る方法

スマートフォンのテザリングでSSH接続
これだと
Bluetoothテザリング

があるが
問題は複数のペアリングが可能かということ

Alexaを利用してハンズフリーで操作
これもありだけど
スマホでテザリングしてる状態で
Alexaが使えるのか?

とりあえずSSHでログインしてシャットダウンがベスト
あとはBluetoothボタンが候補
あとは人感センサーか音声でシャットダウンが候補

動画については
raspividからFFmpegへパイプ入力してFFmpegのsegmentオプションで分割すれば、これらの問題がすべて簡単に解決
この方法なら録画した動画を一定時間毎に分割することも、ファイルの名前をそれぞれの録画を開始した時間にすることも、さらに拡張子をH.264からMP4に変換するのもすべて自動的に実行することが可能

例えば解像度1280×720、ビットレート2000kbps、フレームレート30fpsで録画して1分単位で分割すればファイルサイズは1つあたり約15MBなので、ピンポイントで転送すればWi-Fiでもそれほど時間をかけずに取り出せます。

ようやく実際に手を動かしてraspividからFFmpegへパイプ入力するスクリプトを実装
既にドラレコとしてraspividコマンドを実行するスクリプトを組んであるなら、それを書き換えるだけなのですごく簡単

#!/bin/sh

raspivid -o - -w 1280 -h 720 -t 0 -fps 30 -b 2000000 |
ffmpeg -r 30 -i - -vcodec copy \
-f segment -strftime 1 -segment_time 60 \
-segment_format_options movflags=+faststart -segment_format mp4 \
-reset_timestamps 1 \
/home/pi/%Y-%m-%d_%H-%M.mp4

スクリプトの完成系はこんな感じです。これをサービスとしてsystemdに登録しておけば、ラズパイが起動すると自動的に録画を開始

raspividのオプション
オプション 説明
-o 出力ファイル名
-w,-h 解像度
-t 録画時間
-fps フレームレート
-b ビットレート

取得した動画データはFFmpegに渡すので-oでは出力ファイル名を指定しません。録画時間に上限を設けないなら0で良いでしょう。解像度やビットレート等はお好みで。

必要なオプションを記述したら、|でFFmpegにパイプ入力

FFmpegのオプション
オプション 説明
-r フレームレート
-i 入力ファイル
-vcodec 動画のコーデック
-strftime 出力ファイル名に日時を使用するためのオプション
-segment_time 分割時間
-segment_format_options movflags=+faststart 動画のメタデータ情報を先頭に付与する
-segment_format 分割する動画のフォーマット
-reset_timestamps セグメントのタイムスタンプのリセット

4行目以降はFFmpegについての記述になります。見やすくするために適宜改行してありますが、もちろん不要なら改行しなくてもOKです。

フレームレートはraspividコマンドで指定した数字に合わせましょう。入力ファイルについては、今回はパイプ入力するので指定しません。動画の拡張子は変換しますがコーデックは変わらないのでcopyです。

-strftimeは出力ファイル名に日時を使用するためのオプションです。-segment_timeで何秒毎に分割するのか時間を指定します。

-segment_format_options movflags=+faststartを記述しておくと、動画の読み込みにかかる時間が短縮されて再生開始が早くなります。-segment_formatはそのままです

タイムスタンプをリセットせずにセグメントファイルとして保存すると、再生時に早送りやシークができなかったり何かと不便なことになります。リセットしておけば普通の独立した動画として再生することが可能なので、リセットしておきました。

最後に出力ファイル名の指定についてですが、今回使用しているのはDATEコマンドではないので書式が異なることに注意してください。-や_の区切り方などについては自由に書き換えて大丈夫

これをもとにファイルパスを変更し
角度を調整したのが以下のスクリプト

raspivid -o - -rot 270  -w 1280 -h 720 -t 0 -fps 30 -b 2000000 | ffmpeg -r 30 -i - -vcodec copy -f segment -strftime 1 -segment_time 60 -segment_format_options movflags=+faststart -segment_format mp4 -reset_timestamps 1 /home/snowpool/Videos/%Y-%m-%d_%H-%M.mp4

これで Videosディレクトリに1分ごとの動画が保存される

あとはこれを

sudo nano /opt/record.sh

へ記述して

問題がなければ、ラズパイの起動と同時に録画を開始するためにスクリプトをサービスとしてsystemdに登録

sudo nano /etc/systemd/system/record.service

中身は

[Unit]
Description = Drive Recorder

[Service]
ExecStart = /opt/record.sh #スクリプトのパス
Restart = always
Type = simple

[Install]
WantedBy = multi-user.target

登録が完了したらサービスを有効化、起動

sudo systemctl enable record.service

sudo systemctl start record.service

サービスが正常に起動してスクリプトが実行されたらひとまずOK