crontab -e
Я не вставил бы его crontab -e
как корень. Это обычно менее очевидно для других администраторов и, вероятно, будет теряться со временем. Вставление их /etc/crontab
можно указать точно время, когда Вы хотите, чтобы они работали, и можно указать другого пользователя также.
Если Вы не заботитесь о запущении скрипта как другой пользователь, и/или Вы просто хотите, чтобы сценарий работал еженедельно, ежедневно, и т.д. затем несколько дистрибутивов предоставляют каталоги, куда сценарии могут быть помещены, который будет автоматически обработан в определенное время.
Например, под основанными на Redhat дистрибутивами:
$ ls -dl /etc/cron*
drwxr-xr-x. 2 root root 4096 Nov 29 11:06 /etc/cron.d
drwxr-xr-x. 2 root root 4096 Nov 29 11:06 /etc/cron.daily
-rw-------. 1 root root 0 Nov 23 07:42 /etc/cron.deny
drwxr-xr-x. 2 root root 4096 Nov 29 11:03 /etc/cron.hourly
drwxr-xr-x. 2 root root 4096 Nov 29 11:06 /etc/cron.monthly
-rw-r--r--. 1 root root 457 Sep 26 2011 /etc/crontab
drwxr-xr-x. 2 root root 4096 Sep 26 2011 /etc/cron.weekly
Я часто буду времена помещать системные кроны уровня, в которых я хочу работать в определенное время /etc/cron.d
вместо /etc/crontab
, особенно, если они - более сложные сценарии.
Я предпочитаю использовать каталоги под /etc/cron*
потому что они - намного более очевидное место, которое другие системные администраторы будут знать для взгляда, и файлами здесь можно управлять через установки пакетов такой как rpm
и/или apt
.
Любой из каталогов, которые я упомянул, определяется для помещения сценариев, которые не будут уничтожены диспетчером пакетов. Если бы Вы обеспокоены защитой crontab записи, то я определенно не вставил бы ее /etc/crontab
файл, и вместо этого помещенный это как надлежащий сценарий в одном из /etc/cron*
каталоги.
Самая простая вещь, которую я могу себе представить, состоит в том, чтобы использовать вторую сессию SSH для пересылки именованного FIFO. Я предполагаю, что у вас есть TMP /
в вашем доме; Не стесняйтесь держать FIFO, куда угодно.
local$ ssh me@remotehost 'mkfifo ~/tmp/alert_fifo ; while cat ~/tmp/alert_fifo ; do : ; done' | \
while read icon_name text ; do
notify_send --urgency=low -i "$icon_name" "$text"
done &
Затем вы можете позволить этому запустить на заднем плане, пока вы открываете вторую сессию SSH, чтобы сделать вашу реальную работу:
local$ ssh me@remotehost
remote$ alias remote_alert='echo ... >~/tmp/alert_fifo'
remote$ long_running_command; remote_alert
... где Remote_alert
является измененным Alios
С Notify_Send - Rugency = Low -i
заменен эхообразными вещами в FIFO.
Это будет работать с минимальным набором инструментов на удаленном компьютере: только утилиты SSH и стандартных POSIX. Однако с FIFO, если вы забудете запустить ваш читатель (или ваш читатель умирают), то ваш писатель повесится. Так что, если у вас есть SOCAT
, вы можете сделать это немного больше прощения:
local$ ssh me@remotehost 'socat UNIX-RECV:~/tmp/alert_socket -' | \
while read ...
...
done &
local$ ssh me@remotehost
remote$ alias remote_alert='echo ... | socat - UNIX-SEND:~/tmp/alert_socket'
Это частичный ответ. См. Аутентификация и авторизация D-Bus , чтобы узнать о точках, на которых я застрял.
notify-send
отправляет сообщение по D-Bus . Современные настольные среды запускают шину D-Bus для каждого сеанса и организуют для программ в сеансе поиск нужной шины, как правило, путем установки переменной среды DBUS_SESSION_BUS_ADDRESS
. D-Bus поддерживает несколько способов подключения к демону, который централизует и отправляет сообщения, включая абстрактные сокеты, сокеты unix и TCP.
OpenSSH ≥6.7 может пересылать сокеты Unix , но, как я пишу, очень немногие системы работают с такой последней версией.
Вы можете запустить демон D-Bus, который прослушивает TCP (вы можете заставить его прослушивать несколько адресов, например TCP и сокет Unix). Это может быть сложно организовать, если dbus-daemon
запускается сценариями запуска вашего сеанса таким образом, на который вы не можете повлиять.
Вы можете перенаправить абстрактный сокет D-Bus или именованный сокет Unix через TCP с помощью таких инструментов, как netcat или socat . Вот проверочный сценарий, который устанавливает пересылку на TCP-порт 8004.
#!/bin/sh
case $DBUS_SESSION_BUS_ADDRESS in
'') echo 1>&2 "No local D-Bus instance";;
unix:abstract=*,guid=*)
guid=${DBUS_SESSION_BUS_ADDRESS##*[:,]guid=}
guid=${guid%%,*}
socket=${DBUS_SESSION_BUS_ADDRESS##*[:,]abstract=}
socket=ABSTRACT-CONNECT:${socket%%,*}
;;
unix:path=*,guid=*)
guid=${DBUS_SESSION_BUS_ADDRESS##*[:,]guid=}
guid=${guid%%,*}
socket=${DBUS_SESSION_BUS_ADDRESS##*[:,]path=}
socket=UNIX-CONNECT:${socket%%,*}
;;
*) echo 1>&2 "Unsupported DBUS_SESSION_BUS_ADDRESS";;
esac
socat "TCP-LISTEN:8004,reuseaddr,fork,range=127.0.0.1/32" "$socket"
Теперь вы можете пересылать это TCP-соединение через SSH.
ssh -R 8004:localhost:8004 me@example.net
me@example.net$ export DBUS_SESSION_BUS_ADDRESS=tcp:host=127.0.0.1,port=8004
Вам нужно сделать еще одну вещь: скопировать cookie авторизации на удаленную машину.
rsync -a .dbus-keyrings/org_freedesktop_general me@example.net:.dbus-keyrings/org_freedesktop_general
Помните, что, в отличие от cookie X11, cookie D-Bus может изменяться в течение срока службы сервера. Фактически, в моих экспериментах казалось, что оно меняется нерегулярно, иногда всего через несколько минут.
Насколько я могу судить, только последние версии библиотек Gnome читают файл cookie. notify-send
действительно читает его на FreeBSD 10.1 с Gnome 3.14, но не на Debian wheezy с Gnome 3.4.
Вы можете установить терминатор эмулятора терминала. Затем щелкните правой кнопкой мыши на своем терминале и выберите «следить за активностью» или «следить за тишиной». Это уведомит вас, как только вывод будет произведен в терминале или не будет произведен вывод в течение некоторого времени, соответственно. Если ваша команда не производит вывод, вы можете просто добавить что-то вроде ; echo "{!1} Done!"
в конец вашей команды. Я создал расширение для терминатора, которое уведомляло меня каждый раз, когда в выводе появлялось определенное ключевое слово. Хотя я потерял код. Программирование довольно простое, если вы используете существующие расширения и разбираетесь в Python. Дополнительным преимуществом является то, что он работает одинаково, даже если вы туннелируете через цепочку ssh-соединений.