Я пытаюсь создать службу, которая работает в фоновом режиме и записывает вывод говорящего всякий раз, когда он начинает говорить, и останавливается, когда он останавливается.
Для этой цели я создал следующий bash, и он работает как положено.
echo "Monitoring sound card for recordings"
name="record"
name=~/recordings/$name
while true
do
echo "Monitoring speaker sound "
now="$(date +'%m-%d-%H-%M-%S')"
parec -d alsa_output.pci-0000_00_1b.0.analog-stereo.monitor | sox -v 5 -t raw -b 16 -e signed -c 2 -r 44100 - "$name"-"$now".ogg silence 1 0.1 3% 1 3.0 3%
#test $? -eq 0 && break;
echo "$name-$now was recorded"
done
Чтобы сделать его службой, я создал myrec
в /etc/init.d/
следующим образом:
#! /bin/sh
### BEGIN INIT INFO
# Provides: myrec
# Required-Start: $all
# Required-Stop:
# Default-Start: 2 3 4 5
# Default-Stop:
# Short-Description: your description here
### END INIT INFO
PATH=/home/ahmad/recordings
DESC="Recording audio output"
NAME=myrec
DAEMON=/home/ahmad/recordings/myrec.sh
DAEMON_ARGS="s read"
PIDFILE=/var/run/$NAME.pid
SCRIPTNAME=/etc/init.d/$NAME
После перезагрузки я ожидал, что он запустится автоматически, когда я проверил его статус через sudo service myrec status
, он показывает:
● myrec.service - LSB: your description here
Loaded: loaded (/etc/init.d/myrec; generated)
Active: inactive (dead)
Docs: man:systemd-sysv-generator(8)
Итак, я запустил его sudo service myrec start
, и теперь статус:
● myrec.service - LSB: your description here
Loaded: loaded (/etc/init.d/myrec; generated)
Active: active (exited) since Wed 2020-07-22 15:23:24 +0430; 4s ago
Docs: man:systemd-sysv-generator(8)
Process: 3714 ExecStart=/etc/init.d/myrec start (code=exited, status=0/SUCCESS)
جولای 22 15:23:24 app systemd[1]: Starting LSB: your description here...
جولای 22 15:23:24 app systemd[1]: Started LSB: your description here.
Я не знаю, это работает или нет, но когда я играю и что-то останавливаю, он ничего не записывает в указанную папку.
Не могли бы вы указать мне, что не так? Кстати, если есть инструмент с такой же функциональностью, вы можете представить его мне ...
Обновление:
Обратите внимание, что служба записи требует запуска службы pulseaudio
, а если это не так общесистемная служба, она не запускается при запуске и может вызвать проблему, описанную выше
Пожалуйста, имейте в виду, что pulseaudio
запускается как пользовательская служба, и вам необходимо внести некоторые изменения, например сделать ее общесистемной службой, прежде чем вы сможете запускать свой скрипт как системная служба. иначе вы получите ошибку подключения.
Но если вы хотите создать системную службу для запуска сценария bash, выполните следующие действия:
Во-первых, создайте и отредактируйте пользовательскую службу systemd для запуска сценария оболочки при загрузке, запустив следующую команду в терминале:
sudo nano /etc/systemd/system/MyRec.service
Во-вторых, скопируйте и вставьте следующий код в редактор, замените /FULL/PATH/TO/SCRIPT
на настоящий полный путь к вашему script и сохраните его, нажав Ctrl + X, затем нажмите Y, затем нажмите Enter :
[Unit]
Description=MyRec service
After=gdm.service
[Service]
Type=oneshot
ExecStart=/FULL/PATH/TO/SCRIPT
[Install]
WantedBy=multi-user.target
Третий, ] запустите службу, выполнив в терминале следующую команду:
sudo systemctl start MyRec
Наконец, включите службу, выполнив в терминале следующую команду:
sudo systemctl enable MyRec
Чтобы обеспечить правильное выполнение, обязательно добавьте шебанг #!/bin/bash
в первой строке вашего скрипта, например так:
#!/bin/bash
echo "Monitoring sound card for recordings"
name="record"
name=~/recordings/$name
while true
do
echo "Monitoring speaker sound "
now="$(date +'%m-%d-%H-%M-%S')"
parec -d alsa_output.pci-0000_00_1b.0.analog-stereo.monitor | sox -v 5 -t raw -b 16 -e signed -c 2 -r 44100 - "$name"-"$now".ogg silence 1 0.1 3% 1 3.0 3%
#test $? -eq 0 && break;
echo "$name-$now was recorded"
done
Также сделайте файл скрипта исполняемым, запустив chmod +x
вот так:
chmod +x scriptfile