Snažím se vytvořit službu, která běží na pozadí a zaznamenává výstup reproduktoru, kdykoli začne mluvit, a zastaví se, když se zastaví.
Pro tento účel jsem vytvořil následující bash a funguje podle očekávání.
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
Aby to byla služba, vytvořil jsem myrec
v /etc/init.d/
takto:
#! /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
Po restartu jsem očekával, že se spustí automaticky, když jsem zkontroloval jeho stav pomocí sudo service myrec status
, ukazuje:
● myrec.service - LSB: your description here
Loaded: loaded (/etc/init.d/myrec; generated)
Active: inactive (dead)
Docs: man:systemd-sysv-generator(8)
Tak jsem to spustil pomocí sudo service myrec start
a nyní je stav:
● 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.
Nevím, jestli to běží nebo ne, ale když něco přehraju a zastavím, nic to do zadané složky nezaznamená.
Mohl byste mi poradit, co je špatně? Mimochodem, pokud existuje nástroj se stejnou funkčností, můžete mi ho představit…
Aktualizace:
Upozorňujeme, že nahrávací služba vyžaduje pulseaudio
služba, která má být spuštěna, a pokud se nejedná o celosystémovou službu, nespustí se při spuštění a může způsobit výše uvedený problém
Přijatá odpověď:
Mějte prosím na paměti, že pulseaudio
se spouští jako uživatelská služba a než budete moci spustit skript jako službu sysemd, musíte provést některé změny, jako je vytvoření celosystémové služby. jinak se zobrazí chyba připojení.
Pokud však chcete vytvořit systémovou službu pro spuštění vašeho bash skriptu, postupujte takto:
Za prvé vytvořte a upravte vlastní službu systemd pro spuštění skriptu shellu při spouštění spuštěním následujícího příkazu v terminálu:
sudo nano /etc/systemd/system/MyRec.service
Zadruhé zkopírujte a vložte následující kód do editoru, nahraďte /FULL/PATH/TO/SCRIPT
s skutečnou úplnou cestou k vašemu skriptu a uložte jej stisknutím Ctrl + X poté stiskněte Y poté stiskněte Enter :
[Unit]
Description=MyRec service
After=gdm.service
[Service]
Type=oneshot
ExecStart=/FULL/PATH/TO/SCRIPT
[Install]
WantedBy=multi-user.target
Za třetí spusťte službu spuštěním následujícího příkazu v terminálu:
sudo systemctl start MyRec
Konečně povolte službu spuštěním následujícího příkazu v terminálu:
sudo systemctl enable MyRec
Chcete-li zajistit správné provedení, nezapomeňte přidat znak #!/bin/bash
v prvním řádku vašeho skriptu takto:
#!/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
Také udělejte soubor skriptu spustitelný spuštěním chmod +x
na to takhle:
chmod +x scriptfile