Cerco di creare un servizio che venga eseguito in background e registrare l'output dell'altoparlante ogni volta che inizia a parlare e si interrompe quando si interrompe.
Ho creato la seguente bash per questo scopo e funziona come previsto.
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
Per renderlo un servizio ho creato myrec
in /etc/init.d/
come segue:
#! /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
Dopo il riavvio mi aspettavo che si avviasse automaticamente, quando ne ho verificato lo stato tramite sudo service myrec status
, mostra:
● myrec.service - LSB: your description here
Loaded: loaded (/etc/init.d/myrec; generated)
Active: inactive (dead)
Docs: man:systemd-sysv-generator(8)
Quindi l'ho avviato da sudo service myrec start
e ora lo stato è:
● 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.
Non so se è in esecuzione o meno, ma quando suono e fermo qualcosa, non registra nulla nella cartella specificata.
Potresti guidarmi cosa c'è che non va? A proposito, se c'è uno strumento con le stesse funzionalità, potresti presentarmelo...
Aggiornamento:
Tieni presente che il servizio di registrazione richiede pulseaudio
servizio da eseguire e se non è un servizio a livello di sistema, non viene eseguito all'avvio e può causare il problema precedente
Risposta accettata:
Tieni presente che pulseaudio
viene eseguito come servizio utente ed è necessario apportare alcune modifiche come renderlo un servizio a livello di sistema prima di poter eseguire lo script come servizio sysemd. o altrimenti riceverai un errore di connessione.
Ma, se quello che vuoi è creare un servizio di sistema per eseguire il tuo script bash, segui questi passaggi:
In primo luogo, creare e modificare un servizio systemd personalizzato per eseguire lo script della shell all'avvio eseguendo il seguente comando nel terminale:
sudo nano /etc/systemd/system/MyRec.service
Secondo, copia e incolla il codice seguente nell'editor, sostituisci /FULL/PATH/TO/SCRIPT
con il vero percorso completo del tuo script e salvalo premendo Ctrl + X quindi premi Y quindi premi Invio :
[Unit]
Description=MyRec service
After=gdm.service
[Service]
Type=oneshot
ExecStart=/FULL/PATH/TO/SCRIPT
[Install]
WantedBy=multi-user.target
Terzo, avviare il servizio eseguendo il seguente comando nel terminale:
sudo systemctl start MyRec
Finalmente, abilitare il servizio eseguendo il seguente comando nel terminale:
sudo systemctl enable MyRec
Per garantire una corretta esecuzione, assicurati di aggiungere uno shebang #!/bin/bash
nella prima riga del tuo script in questo modo:
#!/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
Rendi eseguibile anche il file di script eseguendo chmod +x
su di esso in questo modo:
chmod +x scriptfile