Trato de crear un servicio que se ejecuta en segundo plano y graba la salida del altavoz cada vez que comienza a hablar y se detiene cuando se detiene.
Creé el siguiente bash para este propósito y funciona como se esperaba.
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
Para convertirlo en un servicio creé myrec
en /etc/init.d/
de la siguiente manera:
#! /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
Después de reiniciar, esperaba que se ejecutara automáticamente, cuando verifiqué su estado a través de sudo service myrec status
, muestra:
● myrec.service - LSB: your description here
Loaded: loaded (/etc/init.d/myrec; generated)
Active: inactive (dead)
Docs: man:systemd-sysv-generator(8)
Así que lo comencé con sudo service myrec start
y ahora el estado es:
● 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.
No sé si se está ejecutando o no, pero cuando juego y detengo algunas cosas, no graba nada en la carpeta especificada.
Me podrían orientar que es lo que falla? Por cierto, si hay una herramienta con la misma funcionalidad, puede presentármela...
Actualización:
Tenga en cuenta que el servicio de grabación requiere pulseaudio
servicio que se va a ejecutar y si no es un servicio de todo el sistema, no se ejecuta al inicio y puede causar el problema anterior
Respuesta aceptada:
Tenga en cuenta que pulseaudio
se ejecuta como un servicio de usuario y debe realizar algunos cambios, como convertirlo en un servicio de todo el sistema, antes de poder ejecutar su script como un servicio sysemd. o de lo contrario obtendrá un error de conexión.
Pero, si lo que desea es crear un servicio de sistema para ejecutar su script bash, siga estos pasos:
Primero, cree y edite un servicio systemd personalizado para ejecutar el script de shell en el arranque ejecutando el siguiente comando en la terminal:
sudo nano /etc/systemd/system/MyRec.service
Segundo, copie y pegue el siguiente código en el editor, reemplace /FULL/PATH/TO/SCRIPT
con la ruta completa real a su secuencia de comandos y guárdelo presionando Ctrl + X luego presione Y luego presione Enter :
[Unit]
Description=MyRec service
After=gdm.service
[Service]
Type=oneshot
ExecStart=/FULL/PATH/TO/SCRIPT
[Install]
WantedBy=multi-user.target
Tercero, inicie el servicio ejecutando el siguiente comando en la terminal:
sudo systemctl start MyRec
Finalmente, habilite el servicio ejecutando el siguiente comando en la terminal:
sudo systemctl enable MyRec
Para garantizar una ejecución adecuada, asegúrese de agregar un shebang #!/bin/bash
en la primera línea de su guión así:
#!/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
También haga que el archivo de script sea ejecutable ejecutando chmod +x
en él así:
chmod +x scriptfile