Linux Mint'te cron / crontab ile çalışan hiçbir şeyden ses alınamıyor


2

Linux Nane 18.3 Tarçın 64-bit (Sürüm 3.6.6) kullanıyorum ve ANYTHING'den cron üzerinden herhangi bir ses alamıyorum. Bu, komut satırı ses dosyası oynatıcılarını, espeak veya festival vb. TTS uygulamalarını içerir. Hiçbir şey cron'dan işe yaramaz gibi görünmüyor.

Antrenmanlarımı almak ve o gün için olanları hatırlatmak için kullanıyorum… Ama eski, şimdi oldukça ölü Mac Mini’den Linux Nane’e geçtiğimden beri, bunlar artık işe yaramıyor (normal bir xterm komut satırından çalışıyorlar) ). Hiçbir şey için crontab'daki göreceli yolları kullanmam, o yüzden değil.

Standart hatayı standardın dışına yönlendirerek ve bu çıktıyı bir günlük dosyasına eklemek için göndererek hata mesajları almaya çalıştım… Hiçbir şey. Sadece boş bir günlük dosyası.

Crontab dosyamdaki komutları bir betiğe koydum ve onları crontab'a (tam nitelikli) bir yol / dosya adı ile değiştirdim. Sonra aynı günlük dosyasını komut dosyası yoluyla açarım. Bir kez daha açıldı, ancak buna hiçbir şey eklenmedi ve hala ses yok.

Bu sorunu daha önce gören oldu mu? Bu hata ayıklama veya düzeltmek için daha fazla yol üzerinde herhangi bir öneriniz?


(1) Cron job'unuz çalıştığında (konsolda) giriş yaptınız mı? (2) Çevreye bakmayı denedin mi (koş env ) xterm oturumunuzda ve cron işinizde ve bunları karşılaştırarak mı?
Scott

Pulseaudio veya ALSA? (1) Pulseaudio kök (crondan) değil, yalnızca giriş yapmış kullanıcı olarak çalışacaktır. (2) Pulseaudio tüm ALSA cihazlarını kullanıyorsa ALSA doğrudan çalışmayabilir. (3) Eğer cron scriptleri root olarak çalışmazsa, ses cihazlarına erişebilecek bir grupta olmaları gerekebilir.
dirkt

Yanıtlar:


0

buldum bu Mint versiyonunuz için Linux Mint Forumlarında 18.3. Emin değilim, tam olarak kök neden burada, ama Neyse, sadece bir deneyin.

0. Doğru yapılandırmaları arayın. PavuControl

Pulse Audio Volume Control Configuration

Her şey iyi görünüyorsa, o zaman devam edin.

1. En son çekirdek sürümünü yükleyin. Yeniden Başlat & amp; ses için tekrar deneyin.

UpdateManager kullanın veya bu komut Terminalde

apt install linux-image-4.4.0-53-generic linux-image-extra-4.4.0-53-generic linux-headers-4.4.0-53-generic linux-headers-4.4.0-53

ya da herhangi bir şüpheniz varsa, sadece bunu takip edin Topluluk Eğitimi

2. Ses, Sürücüler ve amp; Ses:

Bu komutu çalıştırın ve çıktı arayın. Not Herhangi bir eksik varsa.

pactl set-sink-mute 0 0 ;  pactl list sinks ; lspci -v | grep -A7 -i "audio" ; lsmod

Bu gibi görünmeli:

Audio: Card-1 NVIDIA GK107 HDMI Audio Controller
driver: snd_hda_intel bus-ID: 01:00.1
Card-2 Advanced Micro Devices [AMD/ATI] SBx00 Azalia (Intel HDA)
driver: snd_hda_intel bus-ID: 00:14.2
Sound: Advanced Linux Sound Architecture v: k4.4.0-116-generic

Eğer görürsen Advanced Linux Sound Architecture, yükleme alsamixergui yardımcı olabilir.

3. AlsaMixerGUI: Yükle - Çalıştır - Yeniden Başlat - Test - Ses

  • kurmak alsamixer

    sudo apt-get install alsamixergui
    
  • Koş

    alsamixer
    
  • Basın F6 ve ses kartlarınızdan birini veya diğerini seçin ve sesin çalışıp çalışmadığını test edin.

  • Bazen zorla alsa zorlamak yardımcı olabilir. Bunu bir terminal açıp çalıştırmak için:

    sudo alsa force-reload
    
  • Bitmeden önce birkaç saniye sürecek. Bilgisayarınızı yeniden başlatın ve ses olup olmadığını kontrol edin.

4. Yeniden yükle Alsa ve PulseAudio ve Yeniden Başlat

Hepsini kaldır alsa-base ve pulseaudio paketler.

sudo apt-get remove --purge alsa-base pulseaudio

En son sürümleri almak için güncellemeden sonra kurulumu temizle:

sudo apt-get update
sudo apt-get install alsa-base pulseaudio

Yeniden yüklemeye zorla Alsa

sudo alsa force-reload

Yeniden Başlatma.

5. Yine de Ses alamıyor :(

Peki en azından denedin. Bu daha iyi. Daha fazla ayrıntı eklemek veya sizin için çözülmüş başka bir çözüm bulmaktan çekinmeyin.


Yukarıdaki 5 cevabı: Ses alıyorum ... sadece cron tarafından çalıştırılan hiçbir şeyden değil (hepsi cron tarafından çalıştırılmadığında iyi çalışıyor).
GTbrewer

1
Ya da başka bir yol belirtin (btw, ~ / bin / say festivali ve bununla ilgili seçenekleri kullanan bir kabuk betiğidir): Bu işe yarıyor: "$ test testi" ... bu yok: "* 16 * * * / home / jim / bin / say testi "(crontab'ımdan).
GTbrewer

@GTbrewer, OP'nizi çözen bir cevap yazmaya ne dersiniz?
C0deDaedalus

1
Bunu yazmadan önce sesin neden crondan çalışmadığını bilmeme gerek yok mu? İlk önce bilmem gereken bir şey gibi görünüyor. :-) Cidden, crontab'ımdaki bir şeyden çalıştırıldığında sesin çalışmadığı bir davaya hiç girmedim .... Buna neyin sebep olabileceği hakkında hiçbir fikrim yok.
GTbrewer

1
Görünüşe göre bu herkesin kafasını sarstı, bu yüzden yön değiştiriyorum ve şimdi 90'lı yıllarda yazdığım bir Tcl / Tk saatine bir hatırlatma servisi yazıyorum. Takvim hizmetine benzer şekilde çalışacak, her beş dakikada bir cron ... / / hatırlatıcıları kontrol etme (cron gibi her dakika değil ... ama gerçekten beş dakika içinde bir hatırlatıcıya ihtiyacın varsa, benden daha kötü durumdasın.) Üç büyük beyin tümörü, onları çıkarmak için üç çok ciddi beyin ameliyatı, daha sonra tam beyin / maksimum doz radyasyon tedavisi vardı ... Her neyse, bu dosyadaki hatırlatıcıları idare edecek.
GTbrewer

0

Tamam, neden işe yaramadığına dair bir cevabım yok ama bir çözümüm var.

Belirli e-posta gönderenler için procmail aracılığıyla sesli duyurularda sesin de bozulduğunu keşfettim.

Bu yüzden ÇOK basit [Tcl] [1] betiklerini yarattım. İlk, espeak, vb. Yerine koşmak, metni yalnızca bir metne yazar. ~/.alerts dosya. İkincisi, arka planda oturur, bir tür arka plan programı, bu dosyanın var olmasını bekler ve bu olduğunda, dosyadaki her satırı okur ve konuşur (genellikle yalnızca bir) ve sonra dosyayı siler. Her iki komut dosyasında da herhangi bir çarpışmayı önlemek için dosya kilitleme kullanılır.

Kontrol eden Tcl betiği ~/.alerts bir xterm'den çalıştırıldığı için, cron, procmail ve kimin ne yaptığını bilen bir böcek yok. Sadece işe yarıyor.

Demek benim çözümüm. Beğen, sev, nefret et… benim için çalışıyor.

İlk komut dosyası addalert.

Ve bu komut dosyası --- sadece dosya kilitliyse bekler (en fazla 20 saniye) sonra sıkışmış olduğunu varsayalım) ve mesajı procmail'den yazar:

#!/usr/local/bin/tclsh8.5

set lockfile /home/jim/.alertlock

proc checklock {} {
   global lockfile

   if {![file exists $lockfile]} { return }
   set counter 20
   while {[file exists $lockfile]} {
      incr counter -1
      if {$counter <= 0} {
         file delete -force $lockfile
      } ;# stuck lockfile
      after 333 ;
      after 333 ;
      after 333 ;
   }
   file delete -force $lockfile
}

# wait if file is locked, then lock file while adding alert

checklock 
set lock [open $lockfile w] ; puts $lock "" ; close $lock

set f [open /home/jim/.alerts a]
puts $f [lindex $argv 0]
close $f
file delete -force $lockfile

Checklock prosedürünü kendi dosyasına taşıyarak her iki betiği de kısaltabilirim, ancak bunun gibi küçük şeyler için buna değmez (benim için ... sadece böyle hızlı kesmek için yukarıdaki gibi kes / yapıştır kullan). Bir sonraki adımda doaler denir ve asıl işi yapar (bu komut satırını kullanırsanız bir xterm'den veya terminalden başlatılır).

#!/usr/local/bin/wish8.4

set home /home/jim
set say /home/jim/bin/speak
set alertsfile $home/.alerts
set lockfile $home/.alertlock

cd $home

proc checklock {} {
   global lockfile

   if {![file exists $lockfile]} { return }
   set counter 20
   while {[file exists $lockfile]} {
      incr counter -1
      if {$counter <= 0} {
         file delete -force $lockfile
      } ;# stuck lockfile
      after 333 ;
      after 333 ;
      after 333 ;
   }
   file delete -force $lockfile
}


proc handle_alerts {} {
   global say alertsfile lockfile
   set lock [open $lockfile w] ; puts $lock "" ; close $lock
   set f [open $alertsfile r]
   set alertlist [split [read $f] \n]
   close $f

   foreach alert $alertlist { exec $say $alert }
   file delete $alertsfile
   file delete $lockfile
}


while {1} {
   after 333 ;
   after 333 ;
   after 333 ;
   if {[file exists $alertsfile] && ![file exists $lockfile]} {
      handle_alerts
   }
}

Basitçe söylemek gerekirse, kilit dosyasının kaldırılmasını bekler (tekrar, maksimum 20s), var olur, sonra dosyayı açar, okur (her alarm kendi satırında olduğu için satırlara böler), kapatır ve sonra uyarıları okumak için bir TTS programı (espeak) kullanır. Ardından kilit dosyasını (~ / .alertlock) ve uyarı dosyasını (~ / .alerts) siler.


1
Tam olarak hangi senaryoyu çalıştırıyorsunuz?
confetti

Bu dürüst olmak gerekirse makul bir çözüm gibi geliyor. Fakat eğer senaryolar çok uzun veya çok karmaşık değilse, onları buraya herkes için referans olarak göndermek mantıklı olacaktır.
JakeGould

Betikten önceki örnek kullanım neden GoFundMe'den bahsetti? Procmail kural dosyasından başka bir örneği kolayca seçebilirdim ... En iyisini seçtim. Bu kadar. Dosyanın en üstünden seçtiğim örnek.
GTbrewer
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.