Je tente d'écrire un script Bash qui crée un horodatage (à écrire dans le fichier) chaque fois qu'une certaine chaîne se trouve dans la sortie de DBU-Monitor (paramètres spécifiés plus tard en poste). L'objectif principal de mon script est de sauvegarder le temps (y compris des millisecondes) et une date chaque fois qu'une chanson commence à jouer sur Spotify, car elle utilise des notifications.
La commande suivante sortira string "Spotify"
Chaque fois que des êtres de chanson jouent.
dbus-monitor --session interface='org.freedesktop.Notifications',member='Notify' | grep 'string "Spotify"'
Ma tentative:
search='string "Spotify"'
found=$(dbus-monitor --session interface='org.freedesktop.Notifications',member='Notify' | grep 'string "Spotify"')
while [ ${search} == ${found} ]; do
date -u +%Y%M%d-%H%M%S.%N >> timestamp.txt
done
Je suppose que la raison de ma dysfonction de mon code est que la DBU-Monitor fonctionne continuellement, empêchant ainsi la boucle tandis que de l'exécution.
Cela devrait fonctionner:
stdbuf -oL dbus-monitor --session interface='org.freedesktop.Notifications',member='Notify' |
while grep -q 'string "Spotify"'; do
date -u +%Y%M%d-%H%M%S.%N >> timestamp.txt
done
Modifier après @ Stéphanechazelas Commentaires:
stdbuf -oL dbus-monitor --session interface='org.freedesktop.Notifications',member='Notify' |
grep --line-buffered 'string "Spotify"' |
while read trash; do
stdbuf -oL date -u +%Y%M%d-%H%M%S.%N >> timestamp.txt
done
+1 Autres réponses mais je garde cela pour la complétude
Dans ce cas, il ressemble à dbus-monitor
fournit déjà des horodatages (dans les microsecondes de l'époque +). Donc, vous n'avez peut-être pas besoin d'exécuter date
pour chaque match. Peut-être que l'expression correspondante peut réduire, par exemple, arg0='Spotify'
.
Vérifiez la sortie de ceci:
dbus-monitor "
type='method_call',
interface='org.freedesktop.Notifications',
member='Notify',
arg0='Spotify'"
J'espère que vous ne verrez que des messages DBUS concernant des notifications de Spotify (incapable de tester cela - il suffit d'une suppression de la recherche de Spec DB ). Si cela fonctionne, les suivants peuvent être appropriés:
dbus-monitor --profile "type='method_call',
interface='org.freedesktop.Notifications', member='Notify', arg0='Spotify'" |
gawk -F '\t' '
$NF=="Notify" {
secs = usecs = $2
sub(/^[^.]+/,"",usecs)
print strftime("%Y%m%d-%H%M%S",int(secs),"UTC") usecs
fflush()
}' > timestamp.log
Utilisant --profile
Pour le format de sortie, car il semble plus simple d'analyser que la valeur par défaut --monitor
sortir. Tuyauterie à GNU awk
Pour extraire et formater l'horodatage.