Могу ли я использовать cron, чтобы звонить на вершине часа, как напольные часы?

8

Я заблудился в Askubuntu, читая вопросы и ответы и экспериментируя с рекомендуемыми фрагментами кода. Поэтому я часто пропускаю переключение телевизионных новостных каналов в Интернете в самый разгар рабочего дня Не большая проблема для каналов YouTube, которые позволяют сдвигать время, но это «шоу-стопер» для телеканалов, использующих Flash Player.

Можно cronли настроить запуск задания в начале каждого часа, где я предоставляю сценарий, который звучит как дедушка, как звуки часов (конечно, с тонким звуком!)? Незначительный перезвон мог звучать в нижней части часа тоже. Я уверен, что могу найти подходящие файлы .oggили .ogaфайлы в сети, и я знаю, что могу использовать их ogg123для воспроизведения. Я просто не знаю, смогу ли cronэто сделать. Я знаю, что мог бы использовать сценарий, который спит и просыпается, чтобы проверить время, но мне не нравится мысль о том, чтобы что-то работало постоянно (этого уже достаточно, я думаю).

Если это можно сделать, cronможет кто-нибудь ответить, как это настроить?

Спасибо.

WinEunuuchs2Unix
источник
Я не очень хорош в английских идиомах. начало каждого часа, означающее начало каждого часа?
Heemayl
1
@heemayl LOL да. Я пришел из того времени, когда были изобретены цифровые часы, и была минутная стрелка, которая, когда «сверху» означала 00 часов, а когда «снизу» означала 30 часов. Хе-хе
WinEunuuchs2Unix
sudo apt-get установить mcron - stackoverflow.com/questions/44470965/…
SDsolar
@Ssolar, похоже, это замена, cronкоторая выходит за рамки вопроса. К вашему сведению, я написал сценарий дедушкиных часов в ответе ниже.
WinEunuuchs2Unix

Ответы:

7

Да, ты можешь.

Откройте cronтаблицу с помощью crontab -eи добавьте:

00 * * * * /path/to/player /path/to/file.ogg

Замените /path/to/player, и /path/to/file.oggс соответствующими значениями, которые вы хотите.

Выше будет воспроизводиться звук (т. Е. Запускать команду) каждый час на 00-ой (начало первой) минуты.

Если вы хотите запускать команду также на- 30минуте каждого часа:

00,30 * * * * /path/to/player /path/to/file.ogg
heemayl
источник
При наборе текста crontab -eнаписано, что для моей учетной записи не создан файл. Он предлагает создать один с nano. Я сделал это и настроил предложенные команды. При выборе ^W(файл записи) имя файла по умолчанию: /tmp/crontab.6QN0vo/crontab. Имя файла кажется очень неправильным. Можете ли вы обновить свой ответ для создания нового crontab -eфайла конфигурации? Обратите внимание, что моя система уже настроена на удаление /tmp/IG*файлов старше одного дня, что работало хорошо (я просто не помню, как настроил этого щенка).
WinEunuuchs2Unix
@ WinEunuuchs2Unix Не волнуйтесь, cronвременно открывает этот файл /tmp, после сохранения содержимого создаст / заменит файл /var/spool/cron/crontabs/<username>, и он будет постоянным.
Heemayl
6

Heemayl дал правильный ответ, чтобы cronзапустить в верхней части часа и нижней части часа. Еще раз спасибо! Однако, как обнаружили другие пользователи, cronjobпо умолчанию невозможно воспроизводить звуковые файлы:


Настройка cronдля воспроизведения звуков

Для cronвоспроизведения звуковых файлов необходима exportпеременная окружения:

export XDG_RUNTIME_DIR="/run/user/1000"

Как только это будет сделано, в вашем скрипте будут звучать звуки.

Как указано в другом ответе, ваш идентификатор пользователя не всегда может быть 1000. Чтобы найти свой идентификатор пользователя, используйте:

$ id

uid=1000(rick) gid=1000(rick) groups=1000(rick),4(adm),24(cdrom),27(sudo),30(dip),46(plugdev),113(lpadmin),128(sambashare)

Если ваш идентификатор пользователя не 1000, то измените скрипт на ваш идентификатор.

Настроить cronзапуск верхней части часа и нижней части часа

crontab -e настройка (только последние 5 строк):

# For more information see the manual pages of crontab(5) and cron(8)
# 
# m h  dom mon dow   command
00 *    *   *   *    /usr/local/bin/top-of-hour-chime    >/dev/null
00,30 * *   *   *    /usr/local/bin/bottom-of-hour-chime >/dev/null

Большинство пользователей настраиваются cronна использование nanoредактора. Используйте эти управляющие клавиши nanoдля сохранения вашей работы:

  • Добавьте последние две строки выше и используйте Ctrl+, Oчтобы написать O ut (сохранить) файл.
  • Имя /tmp...файла представлено, но не беспокойтесь, просто нажмите Enter.
  • Теперь используйте Ctrl+, Xчтобы е X это nanoредактор.

В bottom-of-hour-chimeпробегах сценариев в верхней части часов тоже , но, что это нормально , так как это короткое и сладкие.

Если у вас нет >/dev/nullконца строки, cronпопытайтесь отправить вам сообщение с выводом команды. Если у вас нет настройки почтового сервера, в вашем /var/log/syslogфайле появится сообщение об ошибке :

Oct 02 10:00:07 dell CRON[21259]: (CRON) info (No MTA installed, discarding output)

Настройка cronотображения всплывающих уведомлений

Сценарий отображает всплывающее уведомление в верхней части каждого часа. Для этого необходимо экспортировать дополнительную переменную:

eval "export $(egrep -z DBUS_SESSION_BUS_ADDRESS /proc/$(pgrep -u $LOGNAME gnome-session)/environ)";

Содержание top-of-hour-chime

#! /bin/bash

# NAME: top-of-hour-chime
# PATH: /usr/local/bin
# DESC: Play sound called by cron
# CALL: Automatically called by /var/spool/cron/crontabs/<user_name>
# DATE: Created Oct 1, 2016. Modified June 10, 2018.
# UPDT: 2016-11-09 - Add notification bubble with time in text.
#       2018-06-10 - Switch from `ogg123` to `paplay` in default installation.

# exit # uncomment to suppress when watching movies

# paplay needs environment variable exported:
export XDG_RUNTIME_DIR="/run/user/1000"

# needed for notify-send
eval "export $(egrep -z DBUS_SESSION_BUS_ADDRESS /proc/$(pgrep -u $LOGNAME gnome-session)/environ)";

# get hour in 12 hour format
HOUR=$(date +%I)
ZHOUR=$(echo $HOUR | sed 's/^0*//')

pactl set-sink-volume 0 -25%
DISPLAY=:0 notify-send --urgency=critical --icon=/usr/share/icons/gnome/256x256/status/appointment-soon.png "It is ""$ZHOUR"" o'clock"
paplay '/usr/share/sounds/ubuntu/ringtones/Melody piano.ogg'
pactl set-sink-volume 0 +25%

export XDG_RUNTIME_DIR...Необходимо получить звук игры. Это потому, что cronработает в минимальной среде. Эта строка должна быть пропущена первой, если вы используете сторонний звуковой проигрыватель. Затем, если нет звука, верните линию. Тогда все равно, если нет звука, ну счастливой охоты!

Два главных телевизионных новостных шоу, которые я смотрю по сети, имеют более мягкую громкость, чем обычно, поэтому у меня телевизор включен выше обычного. Следовательно, при ogg123воспроизведении звуковых файлов они звучат очень громко. Так pactlиспользуется, чтобы уменьшить громкость до звонка и увеличить его после.

Содержимое нижней части часа

Это почти дубликат top-of-hour-chimeи, возможно, излишний, но включен для полной документации.

#! /bin/bash

# NAME: bottom-of-hour-chime
# PATH: /usr/local/bin
# DESC: Play sound called by cron
# CALL: Automatically called by /var/spool/cron/crontabs/<user_name>
# DATE: Oct 1, 2016. Modified June 10, 2018.

# UPDT: 2018-06-10 Switch from `ogg123` to `paplay` installed by default.

# exit # Uncomment to suppress when watching movies.

# paplay needs environment variable exported:
export XDG_RUNTIME_DIR="/run/user/1000"

pactl set-sink-volume 0 -25%
paplay /usr/share/sounds/ubuntu/ringtones/Bliss.ogg
pactl set-sink-volume 0 +25%
WinEunuuchs2Unix
источник
1

Несмотря на использование этого экспорта:

# paplay needs environment variable exported:
export XDG_RUNTIME_DIR="/run/user/1000"

это не сработало.

После нескольких месяцев исследований не нашли решения.

В отчаянии попробовал следующее и все заработало:

Введите следующее в contab

# Terminal command: crontab -e
# Detect the name of the display in use
display=":$(ls /tmp/.X11-unix/* | sed 's#/tmp/.X11-unix/X##' | head -n 1)"
user=$(who | grep '('$display')' | awk '{print $1}') # the user of the display 
uid=$(id -u $user) #Detect the id of the user

XDG_RUNTIME_DIR=/run/user/${uid}

*/5 * * * * sh /root/.play_sound.sh

Следующее создание .play_sound.sh

/root/.play_sound.sh

display=":$(ls /tmp/.X11-unix/* | sed 's#/tmp/.X11-unix/X##' | head -n 1)"
user=$(who | grep '('$display')' | awk '{print $1}') # the user of the display 
uid=$(id -u $user) #Detect the id of the user

su - $user -c "paplay /usr/share/sounds/freedesktop/stereo/complete.oga"

Надеюсь это поможет.

ColinWa
источник