29.01.13

Настройка cron


Cron — запуск программ пользователя в указанное время

В ОС Unix существует возможность запускать программы пользователя в указанное им время. Для этого используется программа cron, которая получает инструкции от пользователей и следуя им производит выполнение любых задач по полученным сценариям. Наши клиенты могут пользоваться данной возможностью для выполнения периодических задач.

Как настраивать cron

Конфигурирование сценариев cron производится через unix shell. Прежде всего нужно определить какие программы вы хотите запускать и узнать полные пути к ним на диске сервера. Для этого перейдите с помощью команды cd в каталог где находится запускаемая программа и узнайте полный путь к этому каталогу с помощью команды pwd. Путь может выглядеть например как /home/u12345/scripts/script.pl. Убедитесь что файл, который вы хотите запускать, имеет права на чтение+исполнение (r+x) для владельца файла.
Поменять права на нужные можно командой:
chmod 750 script.pl
Далее выполните команду crontab -e. Вы окажетесь в текстовом редакторе vi, где сможете вводить текст сценария для cron. Краткая справка по редактору vi:
  • для вставки текста нажмите i, затем вводите текст
  • для удаления символов нажмите ESC, а затем наберите x
  • для выхода из vi без сохранения изменений нажмите ESC, а затем наберите :q!
  • для сохранения и выхода нажмите ESC, а затем наберите :wq
Задания для cron пишутся по одному в строке. После каждой строки, в том числе после последней или единственной, обязательно нужно нажать enter — иначе задания работать не будут.
Задание для cron выглядит как строка, в начале находятся пять обязательных полей для указания периодичности задания, а далее следует команда, которую нужно запускать:
поле1 поле2 поле3 поле4 поле5 команда
Значения первых пяти полей:
  1. минуты — число от 0 до 59
  2. часы — число от 0 до 23
  3. день месяца — число от 1 до 31
  4. номер месяца в году — число от 1 до 12
  5. день недели — число от 0 до 7 (0-Вс,1-Пн,2-Вт,3-Ср,4-Чт,5-Пт,6-Сб,7-Вс)
Для каждого конкретного параметра можно задать несколько значений через запятую. Например, если в поле «часы» написать 1,4,22, то задание будет запущено в 1 час ночи, в 4 часа утра и в 22 часа. Можно задать интервал — 4-9 будет означать, что программу нужно запускать каждый час в период с 4 до 9 часов включительно. Символ '*' означает «все возможные значения». Например, указание '*' в поле «часы» будет означать «запускать каждый час». Символ '/' служит для указания дополнительной периодичности задания. Например, '*/3' в поле «часы» означает «каждые три часа».
Итак, как выглядит простейший сценарий cron:
0 */3 * * 2,5 /home/u12345/script.pl
Скрипт /home/u12345/script.pl будет автоматически запускаться каждые три часа во вторник и в пятницу. Введя такой сценарий в редакторе vi выйдите с сохранением результатов редактирования и, если вы не допустили ошибок, задание будет поставлено на выполнение с указанной периодичностью. Если при редактировании были допущены ошибки, cron сообщит вам о них.
Например:
/tmp/crontab.xxxxxxx: 1 строк, 9 символов
crontab: installing new crontab
"/tmp/crontab.xxxxxxx":1: bad minute
crontab: errors in crontab file, can't install
Do you want to retry the same edit?
Исправьте ошибки и попробуйте сохранить задание опять.
Посмотреть список уже установленных в cron сценариев можно командой crontab -l:
-bash-2.05b$ crontab -l
0 */3 * * 2,5 /home/u12345/script.pl
Рекомендация: если требуется запускать какую-то программу один раз в день, особенно если она требует для выполнения больших ресурсов, выполняйте такое задание ночью, в период с 2 до 8 часов — нагрузка на серверы в это время минимальна.

Примеры использования cron

Ниже приводятся примеры заданий для cron. Надеемся, эта информация поможет вам лучше понять работу этой программы.
# выполнять задание раз в час в 0 минут
0 */1 * * * /home/u12345/script.pl

# выполнять задание каждые три часа в 0 минут
0 */3 * * * /home/u12345/script.pl

# выполнять задание по понедельникам в 1 час 15 минут ночи
15 1 * * 1 /home/u12345/script.pl

# выполнять задание 5 апреля в 0 часов 1 минуту каждый год
1 0 5 4 * /home/u12345/script.pl

# выполнять задание в пятницу 13 числа в 13 часов 13 минут
13 13 13 * 5 /home/u12345/script.pl

# выполнять задание ежемесячно 1 числа в 6 часов 10 минут
10 6 1 * * /home/u12345/script.pl

Как запускать PHP-скрипты по расписанию

Вы можете выполнять запуск скриптов на языке PHP в указанное время с желаемой периодичностью. Для этого требуется использовать PHP-CLIинтерпретатор, пример использования которого описан здесь.
Поскольку не все PHP-программы могут работать через CLI SAPI без предварительной модификации, можно запускать их через wget. Например:
/usr/local/bin/wget -O /dev/null -q http://mysite.tld/cron.php?action=123
Если в скрипте используются функции requireinclude, причём в них указаны относительные пути, то в начале выполняемого скрипта используйте вызов функции chdir(), которая задаст текущую рабочую директорию.

Как получать сообщения об ошибках от программ, запускаемых cron

Если при выполнении программы, которая запускается из cron, возникли ошибки, наверняка вы захотите получать сообщения об этих ошибках, чтобы полностью контролировать работу периодически запускаемых заданий. Для этого в начале cron-сценария поместите такую строку:
MAILTO=адрес@домен.ru
Конечно, адрес@домен.ru нужно заменить на реально существующий адрес электронной почты куда надо будет доставлять уведомления. Если нужно получать сообщения об ошибках на несколько адресов, укажите все эти адреса через запятую.
Обратите внимание на то, что cron будет присылать по почте то, что выводят запускаемые скрипты. Например, если вы напишете скрипт, который будет печатать строчку «Hello, world» и поставите его на выполнение через cron, вы будете получать по почте письмо со строкой «Hello, world» каждый раз, когда cron будет запускать такой скрипт.
Чтобы избежать этого, например когда текст, выводимый скриптом, вам не нужен, надо добавить в конец строки-сценария для cron символы
> /dev/null 2>&1
Полностью строка для cron будет выглядеть так:
  • Для PHP4:

    0 1 * * * /usr/local/bin/php -q $HOME/script.php > /dev/null 2>&1
  • Для PHP5:

    0 1 * * * /usr/local/bin/php -q $HOME/script.php > /dev/null 2>&1
Рекомендуем проверять корректность синтаксиса скриптов, которые вы устанавливаете на выполнение через cron. Скрипты могут содержать ошибку, могут неодинаково работать при запуске через веб-сервер и через cron и так далее. Для того, чтобы убедиться что скрипт будет правильно работать через cron, предварительно проверьте его такой командой в unix shell:
  • Для PHP4:

    /usr/local/bin/php -l script.php
  • Для PHP5:

    /usr/local/bin/php -l script.php
Если ошибок в скрипте нет, вы увидите сообщение «No syntax errors detected in script.php».

Ограничения

Для программ, которые запускаются через cron, действуют такие же ограничения по потребляемым ресурсам, как для процессов, запускаемых пользователем в unix shell. Речь идет об ограничениях на время выполнения программы, количеству доступной памяти, ограничениях на размер файлов и так далее.
Кроме того, существует ограничение на периодичность запуска программ из cron. Пользователь может запускать свои программы таким образом не чаще чем 1 раз в 1 час.
  • man (5) crontab — man-страница по программе crontab

21.01.13

Настройка ftpd


Этот пост пишу потому, что в интернете не нашел нормальной статьи по настройке встроенного во FreeBSD ftp-сервера: кругом сплошные сслыки на “man ftpd”. Интак, мне необходимо поднять ftp с ограниченным доступом по логину/паролю к отдельным папкам для каждого пользователя. Для этих целей ftpd будет выше крыши.
1. В файл /etc/rc.conf добавляем строчки:
ftpd_enable=”YES”
ftpd_flags=”" # здесь прописываем нужные флаги. Их описание я привёл ниже.
Доступные флаги:
-D: запускать ftpd в режиме демона.
-a <адрес>: в режиме демона принимать соединения только на указанный IP-адрес.
-d: включить режим отладки (подробная информация о работе будет выдаваться серверу syslog как LOG_FTP).
-h: не выводить информацию о системе в сообщениях сервера.
-l: протоколировать все сессии (обычно используется/var/log/xferlog).
-A: разрешить только анонимный доступ.
-M: запретить анонимным пользователям создавать папки.
-m: разрешить анонимным пользователям модифицировать существующие файлы (если для этого достаточно системных прав).
-o, -O: разрешить только запись на сервер всем пользователям (-o) или только анонимному пользователю (-O). В частности, таким образом можно организовать сбор с удаленных серверов файлов резервных копий, чтение которых пользователями не предусмотрено.
-r: перевести сервер в режим «только для чтения». Любая модификация размещенных данных будет запрещена.
2. Создаем учётные записи пользователей (например, с помощью adduser), которым будут разрешен доступ к серверу, после чего убеждаемся в том, что их имена не упоминаются в файле /etc/ftpuser (пользователям, упомянутым в этом файле, доступ к ftp будет запрещён).
Для анонимного доступа к серверу необходимо создать учётную запись с именем “ftp”. Корневым каталогом и будет его домашняя папка.
3. Создаем файл /etc/ftpchroot и заполняем его по такому шаблону:
<имя пользователя> <путь к папке>
<@ имя группы> # это для того, чтобы все пользователи данной группы были ограничены одной папкой (можно не указывать).
Пример:
test /home/test
@ wheel
4. Устанавливаем нужные права на папку /home/test (то, что мы хотим разрешить/запретить пользователю test).
5. При необходимости редактируем:
/etc/ftphosts – настройка виртуальных хостов
/etc/ftpwelcome – приветственное сообщение
/etc/ftpmotd – приветственное сообщение, выводимое при входе на сервер
6. Определяемся, как мы будем запускать сервер – через inetd, или же как standalone.
В первом случае в файле /etc/inetd.conf раскоментируем строчку
ftp stream tcp nowait root usr/liexec/ftpd ftpd -l
Во втором случае для запуска используем скрипт /etc/rc.d/ftpd:
# /etc/rc.d/ftpd start
Если его в системе нет (старые версии FreeBSD), создаём вручную:
#!/bin/sh
#
# $FreeBSD: src/etc/rc.d/ftpd,v 1.1 2006/01/21 18:08:15 yar Exp $
#
# PROVIDE: ftpd
# REQUIRE: LOGIN cleanvar
. /etc/rc.subr
name=”ftpd”
rcvar=`set_rcvar`
command=”/usr/libexec/${name}”
pidfile=”/var/run/${name}.pid”
start_precmd=ftpd_prestart
ftpd_prestart()
{
rc_flags=”-D ${rc_flags}”
return 0
}
load_rc_config $name
run_rc_command “$1″
Вот и всё :) Заходим на свой сервер и радуемся жизни ;)

20.01.13

паралельная сборка с портов

Мой очень вольный перевод: 

Для использующих порты 

Вам не требуется ничего делать с целью включения данной возможности. Помеченные совместимыми порты будут автоматически собираться в параллельном режиме. По-умолчанию количество задач равно количеству ядер (процессоров) в системе. 
Чтобы принудительно отключить параллельную сборку, добавьте 
DISABLE_MAKE_JOBS=yes в /etc/make.conf. 
Чтобы принудительно указать количество параллельных задач, добавьте, к примеру 
MAKE_JOBS_NUMBER=6 в /etc/make.conf. 
Чтобы принудительно включить параллелизацию для всех портов(и возможно получить проблемы), добавьте 
FORCE_MAKE_JOBS=yes в /etc/make.conf

Использование portupgrade для обновления установленных из портов программ.



Сегодня я хочу рассказать о том, как же во FreeBSD правильно обновить установленные из портов программы. Механизм обновления программ со старой версии на новую прост и логичен. Благодаря его продуманности работать с ПО, которые установлены из системы портов очень легко даже новичкам. В деле обновления нам поможет программа по имени portupgrade.
Я работаю в FreeBSD 7.1
Первым дело нам нужно обновить порты.
Потом устанавливаем portupgrade
cd /usr/ports/ports-mgmt/portupgrade  && make install clean
??????????????????????????????????????????????????????????????????????
?                Options for portupgrade 2.4.6_2,2                   ?
? ?????????????????????????????????????????????????????????????????? ?
? ?           [X] BDB4  Use Berkeley DB >=2 as backend             ? ?
? ?           [ ] BDB1  Use Berkeley DB 1.85 as backend            ? ?
? ?                                                                ? ?
? ?                                                                ? ?
? ?                                                                ? ?
? ?                                                                ? ?
? ?                                                                ? ?
? ?                                                                ? ?
? ?                                                                ? ?
? ?                                                                ? ?
? ?                                                                ? ?
? ?                                                                ? ?
? ?                                                                ? ?
? ?                                                                ? ?
? ?                                                                ? ?
??????????????????????????????????????????????????????????????????????
?                       [  OK  ]       Cancel                        ?
??????????????????????????????????????????????????????????????????????
опции я оставил по умолчанию
Ставится на современной машине очень быстро.
после установки нам говорят в числе прочего и
Note also, portupgrade knows nothing how to handle ports with different
suffixes (E.g. -nox11). So you should explicitly define variables
(E.g. WITHOUT_X11=yes) for the ports in /etc/make.conf or pkgtools.conf
(MAKE_ARGS section) files.
Так что если вы работаете только с консолью, то добавляем
WITHOUT_X11=yes
в
/etc/make.conf
Если работаете в Х среде, это делать не нужно.
Теперь смотрим, какие порты нам можно обновить. Вот что у меня вышло.
pkg_version -v | grep "need"

apache-2.2.11_3                     <   needs updating (port has 2.2.11_4)
clamav-0.94.2                       <   needs updating (port has 0.95.1_1)
curl-7.19.2                         <   needs updating (port has 7.19.4)
freetype2-2.3.7                     <   needs updating (port has 2.3.9_1)
gamin-0.1.10                        <   needs updating (port has 0.1.10_1)
gio-fam-backend-2.18.4              <   needs updating (port has 2.20.1)
glib-2.18.4                         <   needs updating (port has 2.20.1)
havp-0.88_1                         <   needs updating (port has 0.90)
icu-3.8.1_1                         <   needs updating (port has 3.8.1_2)
libSM-1.1.0,1                       <   needs updating (port has 1.1.0_1,1)
libX11-1.1.3_1,1                    <   needs updating (port has 1.2.1,1)
libslang2-2.1.4                     <   needs updating (port has 2.1.4_1)
m4-1.4.11,1                         <   needs updating (port has 1.4.12,1)
openldap-client-2.4.13              <   needs updating (port has 2.4.16)
pcre-7.8                            <   needs updating (port has 7.9)
perl-5.8.9                          <   needs updating (port has 5.8.9_2)
php5-5.2.8                          <   needs updating (port has 5.2.9)
php5-session-5.2.8                  <   needs updating (port has 5.2.9)
php5-xml-5.2.8                      <   needs updating (port has 5.2.9)
php5-xmlrpc-5.2.8                   <   needs updating (port has 5.2.9)
png-1.2.34                          <   needs updating (port has 1.2.35)
python25-2.5.2_3                    <   needs updating (port has 2.5.4_1)
rtgui-0.2.2_2                       <   needs updating (port has 0.2.7)
rtorrent-devel-0.8.4                <   needs updating (port has 0.8.4_1)
ruby-1.8.6.287,1                    <   needs updating (port has 1.8.7.72_1,1)
ruby18-bdb-0.6.4                    <   needs updating (port has 0.6.5)
squid-3.0.13                        <   needs updating (port has 3.0.14)
trafd-3.0.1_2                       <   needs updating (port has 3.0.2.1)
xmlrpc-c-devel-1.11.00_3            <   needs updating (port has 1.18.00)
xproto-7.0.14                       <   needs updating (port has 7.0.15)
И когда только успел столько понаставить :) .
Обновлять программы просто. Пишем в консоли
portupgrade имя_обновляемого_порта
Важно помнить, что во время обновления сервис будет остановлен. Если это ваш домашний компьютер – как правило это допустимо, а если прокси сервер организации и вы задумаете обновить тот же squid – то лучше это делать в нерабочие часы, вдруг что-то пойдет не так, как вы хотели?
ВНИМАНИЕ! Сохраняйте конфигурационные файлы обновляемых программ. Причем это нужно делать перед каждым обновлением, а то рискуете в самый неподходящий момент их потерять.
Как более пароноидальный вариант – перед обновление сделайте пакеты из установленных программ. Откатиться будет еще проще, чем с одними голыми конфигами на руках.
Команда
portupgrade -arR
Позволяет обновить все порты.
-a значит применить ко всем.
-R проверит зависимости для установки
-r проверит приложения, которые зависят от порта.
Сочетание этих ключей предотвратит появление в вашей системе устаревших зависимостей и несовместимости программ.
Иногда во время использования portupgrade появляется предложение запустить pkgdb -F. Эта команда обновляет базу данных пакетов. Эта база данных находится в /var/db/pkg/pkgdb.db. Если вы увидели это сообщение, запустите о чем вас просит система.
pkgdb  -F
интерактивно исправляет базу данных пакетов, т.е. спрашивает вас как поступить. Если не хотите с этим связываться, можно позволить системе самой решать как лучше.
Это делается так
pkgdb -fu
Вот вроде бы и все про обновление программ, которые установлены из портов, при помощи portupgrade.

19.01.13

G2M4 works with mplayer in MPUI


Success ! We were able to play gotomeeting files that use codec G2M4 in Mplayer and in MPUI (http://mpui.sourceforge.net/).
The following instructions describe three ways to the success. After finishing the installation, you may also want to make the movie seekable by running
mencoder.exe    -forceidx     InputFile.wmv   -o OutputFile.wmv    -oac copy -ovc copy

G2M4 works with Mplayer and Mencoder

1. Download MPlayer-p4-svn-34118.7z and unzip it (7z x MPlayer-p4-svn-34118.7z).
2. Modify codecs.conf as explained below (add G2M4 to the line with G2M2, G2M3)
3. Place the file G2M4.DLL from Citrix (see below) next to the mplayer.exe or to the codecs directory.
4. Use mplayer and mencoder. Make sure HOME variable is not defined (or place the codecs.conf and g2m.dll accordingly).

G2M4 works with MPUI.2011-06-09.Full-Package

1. Download and install MPUI.2011-06-09.Full-Package.exeThis is supposed to contain (as defined in Build.nsi,r=276)

!define BUILD_NO "91"
!define COMPILE_DATE "2011-06-09"
!define VER_MPLAYER "SVN-r33574 (2011-06-09)"
!define VER_SMPLAYER "v0.6.9 (SVN-r3607)"
!define VER_MPUI "v1.2-pre3 (Build 38)"
!define VER_NSIS "v2.46"
!define VER_CODECS "(2011-01-31)"


2. Modify one line in the codecs.conf file as follows:
videocodec gotomeeting
        info "GoToMeeting codec"
        status working
        fourcc G2M2,G2M3      <--------- Here, we have to add  ,G2M4
        driver dmo
        dll "G2M.dll"
        guid 0x23F891A4, 0x572B, 0x474A, 0x86, 0xDA, 0x66, 0xCD, 0xD3, 0xD1, 0xAC, 0x2E
        out BGR24,RGB24 flip

3. Delete g2m.dll installed with MPUI&Mplayer and replaced it by a current G2M.dll obtained from cytrix codec pack (cf. also http://gotomeeting.com/). After installation it can be found e.g. as follows
G2M.dll      C:\Users\<username>\AppData\Local\Citrix\GoToMeeting\723      7,87 MB  
G2M.dll      C:\Users\<username>\AppData\Local\Citrix\GoToMeeting\799      14,88 MB 

4. You can place your wmv file next to MPUI.exe if you want it playing immediately. Double click MPUI.exe.

G2M4 works with MPUI-1.2-pre3_with_MPlayer-SVN-r26251.zip

1. Download and unzip MPUI-1.2-pre3_with_MPlayer-SVN-r26251.zip (3.8 MB).
2. Start MPUI and observe the location where mplayer creates directory mplayer and file config. Normally it is just next to the MPUI.exe. (If started from cygwin, it is your in HOME directory.) The location of created file is mentioned in the mplaer's output (mplayer console) which is accessible from MPUI menu.
Obtain a valid codecs.conf with modification mentioned above and put it next to the config file. The following version of codecs.conf enables G2M4 but disable sound (and everything else).
;=============================================================================
;  Default codecs config file.
;  Before editing this file, please read DOCS/tech/codecs.conf.txt !
;=============================================================================

release 20100605
; this is not the correct release :-(

;=============================================================================
;                   VIDEO CODECS
;=============================================================================

videocodec gotomeeting
  info "GoToMeeting codec"
  status working
  fourcc G2M2,G2M3,G2M4
  driver dmo
  dll "G2M.dll"
  guid 0x23F891A4, 0x572B, 0x474A, 0x86, 0xDA, 0x66, 0xCD, 0xD3, 0xD1, 0xAC, 0x2E
  out BGR24,RGB24 flip

3. Next to MPUI.exe and mplayer.exe, put G2M.DLL obtained from Citrix (see above).
Note: G2M.dll creates G2MCodec.log (in \Users\<username>) which might be helpful sometimes.
Please, can anyone confirm the success? Does the same recipe work with a current version of mplayer?

 

G2M4 works with MENCODER

2011-10-02, Win7         (Jan Kolar)         kolar  a-t math  cas  cz

My current version of mplayer on cygwin crashes with test files. However mencoder produces output properly.
The result of the following two commands proves that G2M4 works with mencoder on cygwin, provided G2M.DLL form cytrix is placed in the current directory and /etc/mplayer/codecs.conf is modified as mentioned above.
mencoder.exe  work/RADEK_g2m4___TEST_patch__g2m4.wmv -ovc lavc  -o xxxx.wmv -nosound
     # stop by Ctrl-C after a few seconds
DISPLAY=:0 ffplay.exe xxxx.wmv
The commands are not what you need, but I see the video output. You need to specify output format according your needs.
If mencoder works, also mplayer should work, but I cannot test that since a recent mplayer on cygwin crashes for me.
Might be it crashes for any video file. (Might be, the crash is connected to ReadFile and/or WaitSignal ?)
        $ DISPLAY=:0 mplayer  work/g2m4.wmv
        MPlayer SVN-r32518-snapshot-4.5.1 (C) 2000-2010 MPlayer Team
        159 audio & 349 video codecs
        
        Playing work/RADEK_g2m4___TEST_patch__g2m4.wmv.
        ASF file format detected.
        [asfheader] Audio stream found, -aid 1
        [asfheader] Video stream found, -vid 3
        VIDEO:  [G2M4]  1280x1024  24bpp  1000.000 fps  27648.0 kbps (3375.0 kbyte/s)
        
        MPlayer interrupted by signal 11 in module: preinit_libvo
        - MPlayer crashed by bad usage of CPU/FPU/RAM.



dependency for    awn-extras-applets 


summary: cpufreq missing dependency?

later found another non-working machine but
the good news is i think it might just be a missing dependency:

  gnome-applets-1:3.2.1-2.fc16.x86_64

which i must have installed on the working machine but not the non-working ones
because when i happened to install it on the non-working machines the formerly frozen cpufreq icons started to dance (next time the machine power cycled)!

is it time to amend the dependency for
  awn-extras-applets
to require
  gnome-applets
soon before i forget how to fix this for the next time
or did i misread the tealeaves?   :')

17.01.13

Работа с видео в Linux

Оригинал http://zenux.ru/articles/33/


Автозагрузка виртуальной гостевой машины VirtualBox


Имеется VirtualBox на Ubuntu 11.10 на которой постоянно крутится гостевая Windows Server с рядом сервисов необходимых в  сети. Все настраивалось через стандартные графические инструменты но это накладывает одно неудобство, при перезагрузке необходимо вручную запускать заново виртуальную машину. А хочется что бы все запускалось автоматом и без графики.
Для запуска VirtualBox без графики, есть несколько параметров, мы воспользуемся следующим:

VBoxHeadless --startvm <uuid|name>
где <uuid|name> идентификатор или имя нашей гостевой ОС. 

13.01.13

Запуск собственных скриптов systemd


Через rc.local

Как и ранее, чтобы запустить какой-то скрипт при загрузке системы, вы можете поместить его в файл /etc/rc.d/rc.local. Однако стоит учесть специфику запуска этого скрипта в systemd.
service-файл отвечающего за него юнита выглядит следующим образом:
$ cat /lib/systemd/system/rc-local.service
[Unit]
Description=/etc/rc.d/rc.local Compatibility
After=network.target

[Service]
Type=forking
ExecStart=/etc/rc.d/rc.local start
TimeoutSec=0
RemainAfterExit=yes
SysVStartPriority=99
Отсюда видно, во-первых, что файл /etc/rc.d/rc.local обязан быть исполняемым.
А во-вторых, видно, что сервис rc-local имеет зависимость только от цели network.target. Параметр SysVStartPriority=99 отвечает только за приоритет по сравнению с другими sysVinit-скриптами, которых в Fedora становится все меньше. С учетом параллельной загрузки это означает, что скрипт, который вы разместите в файле rc.local может быть запущен слишком рано, например, до старта нужных сервисов. Поэтому, если вы разместите в этом файле скрипты перезапуска апача, то, с большой вероятностью, они не сработают.
В версиях до Fedora 17, не было зависимости от network.target, так что, там этот скрипт запускался практически в самом начале.

С помощью systemd-юнита

Более естественный для systemd способ запускать скрипты - это создание своего собственного юнита.
Просто создайте файл /etc/systemd/system/my_stuff.service со следующим текстом:
[Unit]
Description=Run my stuff  
Requires=network.target   
After=network.target 
 
[Service]
Type=oneshot
RemainAfterExit=True
ExecStart=/some/script --with-some-parameters
ExecStart=/some/other/script
 
[Install]
WantedBy=multi-user.target
Здесь Requires - указывает цель, после которой необходимо запустить сервис, After означает, что сеть должна быть полностью запущена к моменту старта, WantedBy - цель, для которой запускается сервис. В ExecStart должен быть указан полный путь к скрипту или исполняемому файлу, поскольку переменная PATH не используется.
multi-user.target - это аналог init 3 в sysVinit. Подробнее о реализации runlevel-ов в systemd, можно прочесть по ссылке.
В такой конфигурации скрипты будут запускаться сразу после запуска сети и старта всех интерфейсов. Однако systemd позволяет гораздо более гибкую настройку. Например, для выполнения скриптов после запуска графического DM можно использовать After: systemd-user-sessions.service
Небольшой пример: После появления облачного хранилища Яндекс.Диск, захотелось автоматически монтировать его в файловую систему через davfs2 (с заранее положенными логином и паролем в /etc/davfs2/secrets). Прописывание в fstab не дало результатов, как и прописывание в rc.local, поскольку в Fedora 16 оба они обрабатывались ещё до поднятия сети. А вот создание модуля по вышеприведённому образцу решило проблему.

Дополнительно

Для диагностики сервиса используйте команду
systemctl status rc-local.service
или загляните в файл /var/log/boot.log (он появится если в параметрах загрузки убрать quiet, см. Grub2).

Грамотная очистка /var/cache/pacman/pkg


Selectively clean cache

  • Use paccache from pacman-contrib to clean the /var/cache/pacman/pkg directory while allowing to specify how many package versions should be retained (default is 3):
paccache -rv
To list all the options:
paccache -h
  • Because paccache does not remove the cache of uninstalled packages, you can display them with diff from diffutils and then optionally delete each package in the /var/cache/pacman/pkg directory:
pacman -S diff
diff -y <(pacman -Qq) <(ls /var/cache/pacman/pkg/ | sed 's/^\(.*\)-[^-]*-[^-]*-[^-]*$/\1/' | sort -u)
If you want to display the output with colors install colordiff:
pacman -S colordiff
colordiff -y <(pacman -Qq) <(ls /var/cache/pacman/pkg/ | sed 's/^\(.*\)-[^-]*-[^-]*-[^-]*$/\1/' | sort -u)


cacheclean — это скрипт на python для отчистки /var/cache/pacman/pkg работающий по аналогии с pacman -Sc, но имеющий одну важную особенность — он позволяет указать количество сохраняемых версий пакетов и, так же как repo-clean, упомянутый в Arch FAQ & Tips, не удаляет пакеты не установленные в данный момент. 
Т.е. repo-clean удаляет все файлы пакетов акромя последней версии, а cacheclean позволяет указать сколько последних версий сохранять… 

pkgcacheclean — аналог cacheclean, но уже написан на сях и удаляет все неиспользуемые пакеты, грубо говоря это pacman -Sc && cacheclean 2 (2, ибо pkgcacheclean по умолчанию оставляет две последнии версии пакета, хотя количество оставляемых версий можно изменить). 

Обе утилитки имеются в AUR 

Ну и не забываем о опции CleanMethod = KeepCurrent в pacman.conf позволяющей 
оставлять не установленные пакеты с помощью pacman -Sc

Ситуация, когда в кэше накапливается несколько гигабайт пакетов, думаю, известна многим. Так же как и стандартное решение — удаление неустановленных пакетов
$ pacman -Sc
или полная очистка кэша
$ pacman -Scс

Однако, зачастую необходимо удалить лишь устаревшие пакеты, не трогая при этом все остальные. 

Когда я столкнулся с этой проблемой, то тут же написал небольшой скрипт на bash'е:
#!/bin/bash
// переходим в нужную нам директорию
cd "/var/cache/pacman/pkg/";
// забираем список пакетов
files=(`ls | grep pkg.tar.gz`)
// делаем список имен пакетов (которые могут повторяться)
pkgs=(`ls | grep pkg.tar.gz | sed 's/-[0-9].*//'`);
// вычисляем длину массивов
filesLen=${#files[@]}
// перебираем элементы массива pkgs в поисках повторов
for (( i=0; i<$filesLen-1; i++ ));
do
        echo "cheking ${pkgs[$i]} package...";
        for (( j=$i+1; j<${filesLen}; j++ ));
        do
                // если находим повтор
                if [ ${pkgs[$i]} = ${pkgs[$j]} ]; then
                        // сравниваем файлы по дате создания
                        // чтобы удалить старый из двух имеющихся
                        if [ ${files[$i]} -ot ${files[$j]} ]; then
                                echo "found ${files[$j]}";
                                echo "removed ${files[$i]}";
                                rm -Rf ${files[$i]};
                                break;
                        else
                                echo "found ${files[$i]}";
                                echo "removed ${files[$j]}";
                                rm -Rf ${files[$j]};
                        fi
                fi
        done
done

Скрипт ищет повторяющиеся пакеты и удаляет все, кроме того, у которого дата создания позднее.

Однако, как оказалось, данную проблему уже решил человек с ником smirnoffjr, написав программу на С++ под названием repo-clean, которая доступна в AUR'е
yaourt -S repo-clean


Программа умеет перемещать в другую директорию (режим move) и удалять старые версии пакетов (режим clean), или просто выдавать список тех, которые имеют больше одной версии в кэше (режим dry-run). А также поддерживает исключения для указанных пакетов, для этого нужно создать файл ~/.repocleanrc и определить параметр ignore, например, так:
ignore=kernel26rt,mesa


Так же существует неплохой скрипт на python'е, который приведен в вики на официальном сайте, но уступает программе repo-clean по функциональности, т.к. основная опция — это количество версий, которые нужно оставить в сохранности.