Rubby 스크립트의 서비스화(systemd+rvm+사용자 권한으로 실행)
10544 단어 Ruby
개시하다
Raspberry Pi3 소프트웨어 UART 활용에서 제작된 GPS 로그용 스크립트가 예상외로 불안정해 예외적으로 프로그램이 끝나도 재부팅systemd
을 시도했다.
전제 조건
활용
systemd
Goal
rvm 공식 문서 보기
'보글'은 공식 아래 페이지인데 너무 대략적인 설명을 해서 잘 모르겠어요. 그래서 제가 더듬어 봤어요.
또한 정식 순서는 크론 등에서도 사용할 수 있을 것 같다
절차.
기본적으로 다음과 같은 절차다.
기본적으로 다음과 같은 절차다.
rvm를 만드는 wrapper
우선 rmv의 경로를 확인하세요.pi@raspberrypi:~ $ echo $rvm_path
/home/pi/.rvm
그 경로 아래에 있는 wrappers
새 Gem 그룹?, 신중을 기하기 위해 먼저 봅시다.pi@raspberrypi:~ $ ll ~/.rvm/wrappers/
total 0
lrwxrwxrwx 1 pi pi 33 Jul 18 16:22 default -> /home/pi/.rvm/wrappers/ruby-2.7.1
lrwxrwxrwx 1 pi pi 38 Jul 18 16:22 ruby-2.7.1 -> /home/pi/.rvm/gems/ruby-2.7.1/wrappers
lrwxrwxrwx 1 pi pi 45 Jul 18 16:22 ruby-2.7.1@global -> /home/pi/.rvm/gems/ruby-2.7.1@global/wrappers
다음 명령을 사용하여 Gem 세트를 생성합니다.이번에 gps
라는 이름으로 만들어 봤어요.공식 기록에 따르면 왜 gps
와 응용명 지정에 두 개가 필요한지 모르겠다...pi@raspberrypi:~ $ rvm alias create gps ruby-2.7.1@gps
Gemset 'gps' does not exist, 'rvm ruby-2.7.1 do rvm gemset create gps' first, or append '--create'.
Creating alias gps for ruby-2.7.1.....
역시 오류는 있겠지만 아래 방법대로 잘 만들어졌으니 그만두자pi@raspberrypi:~ $ ll ~/.rvm/wrappers/
total 0
lrwxrwxrwx 1 pi pi 33 Jul 18 16:22 default -> /home/pi/.rvm/wrappers/ruby-2.7.1
lrwxrwxrwx 1 pi pi 33 Jul 19 20:01 gps -> /home/pi/.rvm/wrappers/ruby-2.7.1
lrwxrwxrwx 1 pi pi 38 Jul 18 16:22 ruby-2.7.1 -> /home/pi/.rvm/gems/ruby-2.7.1/wrappers
lrwxrwxrwx 1 pi pi 45 Jul 18 16:22 ruby-2.7.1@global -> /home/pi/.rvm/gems/ruby-2.7.1@global/wrappers
시스템용 Unit 정의 파일 만들기
나머지는 보통대로 만드는 것뿐이다.이번 내용은 다음과 같다.WorkingDirectory
에서 스크립트가 있는 디렉터리를 지정하고 ExecStart
에서 wrapper를 통해 bundle 명령을 실행합니다.Restart=always
중요pi@raspberrypi:~ $ cat /etc/systemd/system/gps.service
[Unit]
Description=Gps Service
After=network.target
[Service]
Type=simple
User=pi
Group=pi
WorkingDirectory=/home/pi/project/gps
ExecStart=/home/pi/.rvm/wrappers/gps/bundle exe ruby main.rb
Restart=always
[Install]
WantedBy=multi-user.target
스크립트를 살짝 수정합니다.
가공 작업에 logger와 예외적인 드랍 처리를 추가했습니다.require 'serialport'
require 'nmea_plus'
require 'logger'
logger = Logger.new('gps.log')
logger.info '起動したよ'
puts `sudo rmmod soft_uart.ko`
sleep 0.1
puts `cd ~/project/soft_uart && sudo insmod soft_uart.ko`
sp = SerialPort.new('/dev/ttySOFT0', 9600, 8, 1, 0) # see: https://rubydoc.info/gems/serialport/SerialPort#set_modem_params-instance_method
trap 'SIGINT' do
sp.close if sp
exit
end
count = 0
source_decorder = NMEAPlus::SourceDecoder.new(sp)
source_decorder.each_complete_message do |message|
# カウントアップ
count +=1
# see: https://github.com/ianfixes/nmea_plus/blob/master/lib/nmea_plus/message/nmea/rmc.rb
if 'GPRMC' == message.data_type
logger.info message.utc_time
logger.info message.active? # false: データ無効
logger.info message.latitude
logger.info message.longitude
logger.info message.faa_mode # A: 単独測位(精度3m程度), D: 相対測位(精度0.4m程度)
end
if count >= 10
sp.close # とりあえず閉じてみる
logger.error '落とすよ'
raise '強引なエラー'
end
end
확인
시스템 자체를 다시 불러온 다음 서비스를 시작합니다.sudo systemctl daemon-reload
sudo systemctl start gps.service
일지.. 괜찮은 것 같아!
이렇게 불안정한 각본이 좀 강한 아이가 됐어요.pi@raspberrypi:~ $ tail -f ./project/gps/gps.log
I, [2020-07-19T20:59:05.521956 #6437] INFO -- : 起動したよ
I, [2020-07-19T20:59:06.651867 #6437] INFO -- : 2020-07-19 11:59:06 +0000
I, [2020-07-19T20:59:06.652419 #6437] INFO -- : true
I, [2020-07-19T20:59:06.652937 #6437] INFO -- : 33.725631666666665
I, [2020-07-19T20:59:06.653450 #6437] INFO -- : 131.64383833333332
I, [2020-07-19T20:59:06.654003 #6437] INFO -- : A
I, [2020-07-19T20:59:07.652485 #6437] INFO -- : 2020-07-19 11:59:07 +0000
I, [2020-07-19T20:59:07.653032 #6437] INFO -- : true
I, [2020-07-19T20:59:07.653515 #6437] INFO -- : 33.725631666666665
I, [2020-07-19T20:59:07.654019 #6437] INFO -- : 131.64384
I, [2020-07-19T20:59:07.654624 #6437] INFO -- : A
E, [2020-07-19T20:59:07.694013 #6437] ERROR -- : 落とすよ
I, [2020-07-19T20:59:12.530348 #6460] INFO -- : 起動したよ
I, [2020-07-19T20:59:13.660674 #6460] INFO -- : 2020-07-19 11:59:13 +0000
I, [2020-07-19T20:59:13.661174 #6460] INFO -- : true
I, [2020-07-19T20:59:13.661502 #6460] INFO -- : 33.72563
I, [2020-07-19T20:59:13.661792 #6460] INFO -- : 131.64383666666666
I, [2020-07-19T20:59:13.662027 #6460] INFO -- : A
I, [2020-07-19T20:59:14.660078 #6460] INFO -- : 2020-07-19 11:59:14 +0000
I, [2020-07-19T20:59:14.660613 #6460] INFO -- : true
I, [2020-07-19T20:59:14.660962 #6460] INFO -- : 33.72562833333333
I, [2020-07-19T20:59:14.661288 #6460] INFO -- : 131.64383666666666
I, [2020-07-19T20:59:14.661528 #6460] INFO -- : A
E, [2020-07-19T20:59:14.662166 #6460] ERROR -- : 落とすよ
감상
pi@raspberrypi:~ $ echo $rvm_path
/home/pi/.rvm
pi@raspberrypi:~ $ ll ~/.rvm/wrappers/
total 0
lrwxrwxrwx 1 pi pi 33 Jul 18 16:22 default -> /home/pi/.rvm/wrappers/ruby-2.7.1
lrwxrwxrwx 1 pi pi 38 Jul 18 16:22 ruby-2.7.1 -> /home/pi/.rvm/gems/ruby-2.7.1/wrappers
lrwxrwxrwx 1 pi pi 45 Jul 18 16:22 ruby-2.7.1@global -> /home/pi/.rvm/gems/ruby-2.7.1@global/wrappers
pi@raspberrypi:~ $ rvm alias create gps ruby-2.7.1@gps
Gemset 'gps' does not exist, 'rvm ruby-2.7.1 do rvm gemset create gps' first, or append '--create'.
Creating alias gps for ruby-2.7.1.....
pi@raspberrypi:~ $ ll ~/.rvm/wrappers/
total 0
lrwxrwxrwx 1 pi pi 33 Jul 18 16:22 default -> /home/pi/.rvm/wrappers/ruby-2.7.1
lrwxrwxrwx 1 pi pi 33 Jul 19 20:01 gps -> /home/pi/.rvm/wrappers/ruby-2.7.1
lrwxrwxrwx 1 pi pi 38 Jul 18 16:22 ruby-2.7.1 -> /home/pi/.rvm/gems/ruby-2.7.1/wrappers
lrwxrwxrwx 1 pi pi 45 Jul 18 16:22 ruby-2.7.1@global -> /home/pi/.rvm/gems/ruby-2.7.1@global/wrappers
나머지는 보통대로 만드는 것뿐이다.이번 내용은 다음과 같다.
WorkingDirectory
에서 스크립트가 있는 디렉터리를 지정하고 ExecStart
에서 wrapper를 통해 bundle 명령을 실행합니다.Restart=always
중요pi@raspberrypi:~ $ cat /etc/systemd/system/gps.service
[Unit]
Description=Gps Service
After=network.target
[Service]
Type=simple
User=pi
Group=pi
WorkingDirectory=/home/pi/project/gps
ExecStart=/home/pi/.rvm/wrappers/gps/bundle exe ruby main.rb
Restart=always
[Install]
WantedBy=multi-user.target
스크립트를 살짝 수정합니다.
가공 작업에 logger와 예외적인 드랍 처리를 추가했습니다.require 'serialport'
require 'nmea_plus'
require 'logger'
logger = Logger.new('gps.log')
logger.info '起動したよ'
puts `sudo rmmod soft_uart.ko`
sleep 0.1
puts `cd ~/project/soft_uart && sudo insmod soft_uart.ko`
sp = SerialPort.new('/dev/ttySOFT0', 9600, 8, 1, 0) # see: https://rubydoc.info/gems/serialport/SerialPort#set_modem_params-instance_method
trap 'SIGINT' do
sp.close if sp
exit
end
count = 0
source_decorder = NMEAPlus::SourceDecoder.new(sp)
source_decorder.each_complete_message do |message|
# カウントアップ
count +=1
# see: https://github.com/ianfixes/nmea_plus/blob/master/lib/nmea_plus/message/nmea/rmc.rb
if 'GPRMC' == message.data_type
logger.info message.utc_time
logger.info message.active? # false: データ無効
logger.info message.latitude
logger.info message.longitude
logger.info message.faa_mode # A: 単独測位(精度3m程度), D: 相対測位(精度0.4m程度)
end
if count >= 10
sp.close # とりあえず閉じてみる
logger.error '落とすよ'
raise '強引なエラー'
end
end
확인
시스템 자체를 다시 불러온 다음 서비스를 시작합니다.sudo systemctl daemon-reload
sudo systemctl start gps.service
일지.. 괜찮은 것 같아!
이렇게 불안정한 각본이 좀 강한 아이가 됐어요.pi@raspberrypi:~ $ tail -f ./project/gps/gps.log
I, [2020-07-19T20:59:05.521956 #6437] INFO -- : 起動したよ
I, [2020-07-19T20:59:06.651867 #6437] INFO -- : 2020-07-19 11:59:06 +0000
I, [2020-07-19T20:59:06.652419 #6437] INFO -- : true
I, [2020-07-19T20:59:06.652937 #6437] INFO -- : 33.725631666666665
I, [2020-07-19T20:59:06.653450 #6437] INFO -- : 131.64383833333332
I, [2020-07-19T20:59:06.654003 #6437] INFO -- : A
I, [2020-07-19T20:59:07.652485 #6437] INFO -- : 2020-07-19 11:59:07 +0000
I, [2020-07-19T20:59:07.653032 #6437] INFO -- : true
I, [2020-07-19T20:59:07.653515 #6437] INFO -- : 33.725631666666665
I, [2020-07-19T20:59:07.654019 #6437] INFO -- : 131.64384
I, [2020-07-19T20:59:07.654624 #6437] INFO -- : A
E, [2020-07-19T20:59:07.694013 #6437] ERROR -- : 落とすよ
I, [2020-07-19T20:59:12.530348 #6460] INFO -- : 起動したよ
I, [2020-07-19T20:59:13.660674 #6460] INFO -- : 2020-07-19 11:59:13 +0000
I, [2020-07-19T20:59:13.661174 #6460] INFO -- : true
I, [2020-07-19T20:59:13.661502 #6460] INFO -- : 33.72563
I, [2020-07-19T20:59:13.661792 #6460] INFO -- : 131.64383666666666
I, [2020-07-19T20:59:13.662027 #6460] INFO -- : A
I, [2020-07-19T20:59:14.660078 #6460] INFO -- : 2020-07-19 11:59:14 +0000
I, [2020-07-19T20:59:14.660613 #6460] INFO -- : true
I, [2020-07-19T20:59:14.660962 #6460] INFO -- : 33.72562833333333
I, [2020-07-19T20:59:14.661288 #6460] INFO -- : 131.64383666666666
I, [2020-07-19T20:59:14.661528 #6460] INFO -- : A
E, [2020-07-19T20:59:14.662166 #6460] ERROR -- : 落とすよ
감상
require 'serialport'
require 'nmea_plus'
require 'logger'
logger = Logger.new('gps.log')
logger.info '起動したよ'
puts `sudo rmmod soft_uart.ko`
sleep 0.1
puts `cd ~/project/soft_uart && sudo insmod soft_uart.ko`
sp = SerialPort.new('/dev/ttySOFT0', 9600, 8, 1, 0) # see: https://rubydoc.info/gems/serialport/SerialPort#set_modem_params-instance_method
trap 'SIGINT' do
sp.close if sp
exit
end
count = 0
source_decorder = NMEAPlus::SourceDecoder.new(sp)
source_decorder.each_complete_message do |message|
# カウントアップ
count +=1
# see: https://github.com/ianfixes/nmea_plus/blob/master/lib/nmea_plus/message/nmea/rmc.rb
if 'GPRMC' == message.data_type
logger.info message.utc_time
logger.info message.active? # false: データ無効
logger.info message.latitude
logger.info message.longitude
logger.info message.faa_mode # A: 単独測位(精度3m程度), D: 相対測位(精度0.4m程度)
end
if count >= 10
sp.close # とりあえず閉じてみる
logger.error '落とすよ'
raise '強引なエラー'
end
end
시스템 자체를 다시 불러온 다음 서비스를 시작합니다.
sudo systemctl daemon-reload
sudo systemctl start gps.service
일지.. 괜찮은 것 같아!이렇게 불안정한 각본이 좀 강한 아이가 됐어요.
pi@raspberrypi:~ $ tail -f ./project/gps/gps.log
I, [2020-07-19T20:59:05.521956 #6437] INFO -- : 起動したよ
I, [2020-07-19T20:59:06.651867 #6437] INFO -- : 2020-07-19 11:59:06 +0000
I, [2020-07-19T20:59:06.652419 #6437] INFO -- : true
I, [2020-07-19T20:59:06.652937 #6437] INFO -- : 33.725631666666665
I, [2020-07-19T20:59:06.653450 #6437] INFO -- : 131.64383833333332
I, [2020-07-19T20:59:06.654003 #6437] INFO -- : A
I, [2020-07-19T20:59:07.652485 #6437] INFO -- : 2020-07-19 11:59:07 +0000
I, [2020-07-19T20:59:07.653032 #6437] INFO -- : true
I, [2020-07-19T20:59:07.653515 #6437] INFO -- : 33.725631666666665
I, [2020-07-19T20:59:07.654019 #6437] INFO -- : 131.64384
I, [2020-07-19T20:59:07.654624 #6437] INFO -- : A
E, [2020-07-19T20:59:07.694013 #6437] ERROR -- : 落とすよ
I, [2020-07-19T20:59:12.530348 #6460] INFO -- : 起動したよ
I, [2020-07-19T20:59:13.660674 #6460] INFO -- : 2020-07-19 11:59:13 +0000
I, [2020-07-19T20:59:13.661174 #6460] INFO -- : true
I, [2020-07-19T20:59:13.661502 #6460] INFO -- : 33.72563
I, [2020-07-19T20:59:13.661792 #6460] INFO -- : 131.64383666666666
I, [2020-07-19T20:59:13.662027 #6460] INFO -- : A
I, [2020-07-19T20:59:14.660078 #6460] INFO -- : 2020-07-19 11:59:14 +0000
I, [2020-07-19T20:59:14.660613 #6460] INFO -- : true
I, [2020-07-19T20:59:14.660962 #6460] INFO -- : 33.72562833333333
I, [2020-07-19T20:59:14.661288 #6460] INFO -- : 131.64383666666666
I, [2020-07-19T20:59:14.661528 #6460] INFO -- : A
E, [2020-07-19T20:59:14.662166 #6460] ERROR -- : 落とすよ
감상
Reference
이 문제에 관하여(Rubby 스크립트의 서비스화(systemd+rvm+사용자 권한으로 실행)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/suruseas/items/1b347d31dc508bd76a67텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)