GNU/Linux >> Tutoriels Linux >  >> Ubuntu

Comment configurer un service pour enregistrer la sortie audio en arrière-plan ?

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

Ubuntu
  1. Comment configurer HAProxy dans Ubuntu 16.04

  2. Comment configurer le serveur SFTP MySecureShell sur Ubuntu 18.04

  3. Comment écrire un script de démarrage pour Systemd ?

  4. Comment changer la sortie audio en HDMI à partir de la ligne de commande ?

  5. Comment rediriger la sortie du service systemd vers un fichier

Comment configurer le service de gestion de mot de passe RatticDB sur Ubuntu 16.04

Comment configurer l'authentification multifacteur pour SSH sous Linux

Comment configurer l'exécution automatique d'un script Python à l'aide de Systemd

Comment configurer les raccourcis du bureau pour cPanel

Comment configurer les sauvegardes pour WHM ?

Comment configurer un serveur NGINX RTMP pour le streaming