Страница руководства для systemd unit утверждает:
В частности, перенаправление с использованием "" и ">>", каналов с использованием "|", запуск программ в фоновом режиме с использованием "& "и другие элементы синтаксиса оболочки не поддерживаются.
Далее объясняется, как их можно использовать:
ExecStart=/bin/sh -c 'dmesg | tac'
В вашей ситуации вы могли бы сделать это:
ExecStart=/bin/sh -c 'exec /usr/bin/python2.7 /usr/local/py-kms-master/server.py 192.168.1.100 1688 -v > /usr/local/py-kms-master/pykmsss.log'
Какой бы ни была преобладающая мудрость, каждый раз читать весь файл, чтобы отрезать его последнюю строку, глупо , независимо от того, выполняется ли это в рамках одного процесса/команды, двух или трех.
В отличие от sed -i
, tail
достаточно умен, чтобы не читать файл с начала, чтобы определить его последнюю строку; Кроме того, в linux есть утилита truncate(1)
, которая в сочетании с tail
позволяет вам «вытолкнуть» последнюю строку (с )огромного файла за O (1 )раз:
# usage popline file [line_count, 1 by default]
popline()(LC_CTYPE=C; l=`tail -n "${2:-1}" "$1"; echo t`; l=${l%t}; truncate -s "-${#l}" "$1"; printf %s "$l")
$ wc -l /tmp/foo
3579500 /tmp/foo
$ cp /tmp/foo /tmp/foo1 && time sed -i '$d' /tmp/foo1
real 0m1.077s
user 0m0.457s
sys 0m0.156s
$ cp /tmp/foo /tmp/foo1 && time popline /tmp/foo1
*/
real 0m0.052s
user 0m0.002s
sys 0m0.003s
Цель состоит в том, чтобы иметь одну команду, которая выводит последнюю строку файла и в то же время удаляет эту строку из исходного файла.
sed -i -e '${w /dev/stdout' -e 'd;}' file
Это запустит следующий sed
скрипт:
${
w /dev/stdout
d
}
Последняя строка записывается в /dev/stdout
, а затем удаляется. Все остальные строки записываются обратно в исходный файл через опцию -i
.
Сценарий в командной строке должен быть разделен на две части, поскольку нет другого способа разграничить имя выходного файла команды w
(, кроме вставки буквального символа новой строки ).
Сed
:
ed -s file <<END_ED
p
d
w
END_ED
ed
открывает файл file
и помещает курсор в последнюю строку файла. Первая команда выводит эту строку в стандартный вывод, вторая удаляет ее, а последняя команда записывает буфер обратно в файл. Использование ed
таким образом нецелесообразно для больших файлов.