Ich versuche, einen Dienst zu erstellen, der im Hintergrund läuft und die Ausgabe des Lautsprechers aufzeichnet, wenn er zu sprechen beginnt, und stoppt, wenn er stoppt.
Ich habe zu diesem Zweck die folgende Bash erstellt und sie funktioniert wie erwartet.
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
Um daraus einen Dienst zu machen, habe ich myrec
erstellt in /etc/init.d/
wie folgt:
#! /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
Nach dem Neustart habe ich erwartet, dass es automatisch ausgeführt wird, als ich seinen Status über sudo service myrec status
überprüft habe , es zeigt:
● myrec.service - LSB: your description here
Loaded: loaded (/etc/init.d/myrec; generated)
Active: inactive (dead)
Docs: man:systemd-sysv-generator(8)
Also habe ich es mit sudo service myrec start
gestartet und jetzt ist der Status:
● 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.
Ich weiß nicht, ob es läuft oder nicht, aber wenn ich etwas abspiele und stoppe, nimmt es nichts im angegebenen Ordner auf.
Können Sie mir erklären, was falsch ist? Übrigens, wenn es ein Tool mit der gleichen Funktionalität gibt, können Sie mir das gerne vorstellen…
Aktualisierung:
Bitte beachten Sie, dass für den Aufnahmedienst pulseaudio
erforderlich ist Dienst ausgeführt werden soll und wenn es sich nicht um einen systemweiten Dienst handelt, wird er beim Start nicht ausgeführt und kann das oben genannte Problem verursachen
Akzeptierte Antwort:
Bitte beachten Sie, dass pulseaudio
wird als Benutzerdienst ausgeführt, und Sie müssen einige Änderungen vornehmen, z. B. einen systemweiten Dienst erstellen, bevor Sie Ihr Skript als sysemd-Dienst ausführen können. andernfalls erhalten Sie einen Verbindungsfehler.
Wenn Sie jedoch einen Systemdienst zum Ausführen Ihres Bash-Skripts erstellen möchten, gehen Sie bitte wie folgt vor:
Erstens Erstellen und bearbeiten Sie einen benutzerdefinierten systemd-Dienst, um das Shell-Skript beim Booten auszuführen, indem Sie den folgenden Befehl im Terminal ausführen:
sudo nano /etc/systemd/system/MyRec.service
Zweitens Kopieren Sie den folgenden Code und fügen Sie ihn in den Editor ein, ersetzen Sie /FULL/PATH/TO/SCRIPT
mit dem echten vollständigen Pfad zu Ihrem Skript und speichern Sie es, indem Sie Strg drücken + X drücken Sie dann Y drücken Sie dann Enter :
[Unit]
Description=MyRec service
After=gdm.service
[Service]
Type=oneshot
ExecStart=/FULL/PATH/TO/SCRIPT
[Install]
WantedBy=multi-user.target
Drittens Starten Sie den Dienst, indem Sie den folgenden Befehl im Terminal ausführen:
sudo systemctl start MyRec
Endlich Aktivieren Sie den Dienst, indem Sie den folgenden Befehl im Terminal ausführen:
sudo systemctl enable MyRec
Um eine ordnungsgemäße Ausführung zu gewährleisten, stellen Sie bitte sicher, dass Sie einen Shebang #!/bin/bash
hinzufügen in der ersten Zeile Ihres Skripts wie folgt:
#!/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
Machen Sie die Skriptdatei auch ausführbar, indem Sie chmod +x
ausführen drauf so:
chmod +x scriptfile