Патчи обычно содержатся в .diff
файлы, потому что патчи создаются с помощью diff
команда.
Патч является серией вставок и удалений в исходный код. Поэтому для использования патча, необходимо создать приложение (например, "foobar") из источника после применения патча. Так, на шагах:
1. Получите исходный пакет для foobar.
Большинство дистрибутивов Linux (n.b. исправление не уникально для Linux) имеет "исходные пакеты", можно использовать с этой целью, но так как они неоднородны, я только обращусь к формату первоисточника здесь. Первоисточник не является частью дистрибутива и может быть тверд найти. Хорошим местом для запуска является Википедия, которая имеет статьи для многих распространенных приложений, и статья должна содержать ссылку на домашнюю страницу с исходной загрузкой. Можно также погуглить себя, очевидно. Исходный пакет назовут чем-то как foobar.0.1.tar.bz2
. Распакуйте это - Вам теперь назвали каталог foobar.0.1
.
2. Добавьте патч.
Иногда патчи являются единственными файлами, и иногда они - ряд нескольких файлов. Скопируйте тех, которые в foobar.0.1
и cd foobar.0.1
. Затем, необходимо работать patch
команда. Это читает из стандартного входа, таким образом, Вы хотите передать по каналу .diff
файл в. Хитрая часть определяет, что использовать для -p
опция (при отсутствии инструкций с патчем). Чтобы сделать это, необходимо посмотреть в начале файла исправления. Например:
--- old/comm.c 2003-09-08 14:25:08.000000000 +0000
+++ new/comm.c 2006-07-07 02:39:24.000000000 +0000
В этом случае, comm.c
название исходного файла, который будет изменен. Однако заметьте, что существует каталог, добавленный к нему. Так как это не тот же каталог ("старый" по сравнению с "новым"), это - большая подсказка, что эта часть пути является спамом (в наших целях). Цель -p
переключатель (см. man patch
) должен устранить этот префикс. Это берет число, которое является количеством наклонных черт (/
) устранить, со всем промежуточным; в этом случае мы использовали бы -p1
уменьшать путь только к comm.c
.
Это предполагает comm.c
находится на самом деле в том же каталоге, который будет другой подсказкой относительно того, корректна ли Ваша интерпретация. Если обе тех строки были src/comm.c
, и comm.c
находится на самом деле в src
подкаталог Вашего дерева сборки, затем необходимо использовать -p0
- остерегайтесь этого не использование -p
вообще удалит ВСЕ наклонные черты. Если путь является полным (т.е. начинается /
), это, вероятно, что Вы хотите. Теперь примените патч:
patch -p1 < patch.diff
Источник был теперь изменен. Если существует больше .diff
файлы, примените их тот же путь.
3. Сборка и установка.
Это - нормальный процесс, Вы пошли бы до сборки что-то из источника - сначала ./configure
, затем make
, make check
, make install
. Прежде чем Вы сделаете последний, если у Вас уже есть существующая установка foobar
, решите, хотите ли Вы удалить или перезаписать это или как Вы собираетесь иметь дело с конфликтом имен. Вы, вероятно, хотите foobar
относиться к Вашей новой, исправленной версии а не старой.
Возможно, я что-то упускаю, но я не понимаю, зачем вы вообще возитесь с grep
. Для этого предназначен pgrep
:
#!/bin/sh
# chkconfig: 123456 90 10
workdir=/usr/local/bin/Foo
start() {
cd $workdir
/usr/bin/python26 $workdir/Bar.py &
echo "FooBar started."
}
stop() {
pid=`pgrep -f '/Bar.py$'`
echo $pid
kill $pid
sleep 2
echo "FooBar stopped."
}
case "$1" in
start)
start
;;
stop)
stop
;;
restart)
stop
start
;;
*)
echo "Usage: /etc/init.d/foobar {start|stop|restart}"
exit 1
esac
exit 0
Команда pgrep
предназначена для возврата PID процессов, имена которых соответствуют заданному шаблону. Поскольку это сценарий Python, фактический процесс выглядит примерно так:
python /usr/local/bin/Bar.py
Где имя процесса - python
. Итак, нам нужно использовать флаг pgrep -f
, чтобы сопоставить полное имя:
-f, --full
The pattern is normally only matched against the process name.
When -f is set, the full command line is used.
Чтобы убедиться, что это не соответствует таким вещам, как fooBar.py
, шаблон /Bar.py$
, чтобы он соответствовал только части после последнего /
и в конце строки ( $
).
На будущее: никогда не используйте ps | grep
, чтобы получить PID. Это всегда будет возвращать как минимум две строки, одну для запущенного процесса и одну для только что запущенного grep:
$ ps -ef | grep 'Bar.py'
terdon 27209 2006 19 17:05 pts/9 00:00:00 python /usr/local/bin/Bar.py
terdon 27254 1377 0 17:05 pts/6 00:00:00 grep --color Bar.py