J'essaie de créer un service qui s'exécute en arrière-plan et enregistre la sortie du haut-parleur chaque fois qu'il commence à parler et s'arrête lorsqu'il s'arrête.
J'ai créé le bash suivant à cet effet et cela fonctionne comme prévu.
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
Pour en faire un service, j'ai créé myrec
dans /etc/init.d/
comme suit :
#! /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
Après le redémarrage, je m'attendais à ce qu'il s'exécute automatiquement, lorsque j'ai vérifié son état via sudo service myrec status
, il affiche :
● myrec.service - LSB: your description here
Loaded: loaded (/etc/init.d/myrec; generated)
Active: inactive (dead)
Docs: man:systemd-sysv-generator(8)
Donc je l'ai commencé par sudo service myrec start
et maintenant le statut est :
● 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.
Je ne sais pas s'il est en cours d'exécution ou non, mais lorsque je joue et que j'arrête quelque chose, il n'enregistre rien dans le dossier spécifié.
Pourriez-vous me guider ce qui ne va pas? Au fait, s'il existe un outil avec la même fonctionnalité, vous pouvez me le présenter…
Mise à jour :
Veuillez noter que le service d'enregistrement nécessite pulseaudio
service à exécuter et s'il ne s'agit pas d'un service à l'échelle du système, il n'est pas exécuté au démarrage et peut causer le problème ci-dessus
Réponse acceptée :
Veuillez garder à l'esprit que pulseaudio
est exécuté en tant que service utilisateur et vous devez apporter certaines modifications, comme en faire un service à l'échelle du système, avant de pouvoir exécuter votre script en tant que service sysemd. sinon vous obtiendrez une erreur de connexion.
Mais si vous souhaitez créer un service système pour exécuter votre script bash, veuillez suivre ces étapes :
Tout d'abord, créez et modifiez un service systemd personnalisé pour exécuter le script shell au démarrage en exécutant la commande suivante dans le terminal :
sudo nano /etc/systemd/system/MyRec.service
Deuxièmement, copiez et collez le code suivant dans l'éditeur, remplacez /FULL/PATH/TO/SCRIPT
avec le vrai chemin complet vers votre script et enregistrez-le en appuyant sur Ctrl + X puis appuyez sur Y puis appuyez sur Entrée :
[Unit]
Description=MyRec service
After=gdm.service
[Service]
Type=oneshot
ExecStart=/FULL/PATH/TO/SCRIPT
[Install]
WantedBy=multi-user.target
Troisièmement, démarrez le service en exécutant la commande suivante dans le terminal :
sudo systemctl start MyRec
Enfin, activez le service en exécutant la commande suivante dans le terminal :
sudo systemctl enable MyRec
Pour assurer une bonne exécution, assurez-vous d'ajouter un shebang #!/bin/bash
dans la première ligne de votre script comme ceci :
#!/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
Rendez également le fichier de script exécutable en exécutant chmod +x
dessus comme ceci :
chmod +x scriptfile