Я нашел решение:
Создайте файл .service в каталоге /etc/systemd/system
[Unit]
Description=some_script
[Service]
Type=simple
ExecStart=/home/user/scripts/some_script
Создайте файл .timer в том же каталоге, что и файл .service
[Unit]
Description=Runs some_script 5 mins after boot
[Timer]
OnBootSec=5min
Unit=some_script.service
[Install]
WantedBy=multi-user.target
Запустите и включите файл .timer
sudo systemctl start some_script.timer
sudo systemctl enable some_script.timer
Я читал эту страницу вики и этот блог
Предполагая наличие n
строк вывода не -JSON, следующий короткий сценарий передаст эти строки как есть и использует jq
для форматирования оставшихся строк. Предполагается, что входные данные поступают на стандартный ввод сценария, и сценарий берет число n
из первого аргумента командной строки (или по умолчанию равно 5, если этот аргумент не существует ).
#!/bin/sh
n=${1-5}
if [ "$n" -gt 0 ]; then
head -n "$n"
fi
jq.
Сценарий предполагает, что команда head
будет потреблять ровно n
строк ввода. Существуют реализации head
, которые не ведут себя подобным образом и будут считывать более n
строк, не оставляя ввода для обработки jq
. GNU head
ведет себя в этом аспекте хорошо и работает так, как предполагалось.
Тестирование:
$ sh script.sh 2 <file.json
non-json text
on two lines
{
"name": "myapp",
"hostname": "myhost.local",
"pid": 64662,
"source_file_path": "/path/to/src/connector.js",
"req_id": "2339717c-6c3b-4e51-a4b2-5c647efd9c25",
"connector": "abc123",
"level": "INFO",
"req": {
"method": "GET",
"url": "http://backend/server/url"
},
"time": "2016-09-01T06:31:55.099Z",
"v": 0,
"message": "Outgoing request"
}
Ниже приводится вариант описанного выше, который добавляет очень упрощенное обнаружение начала содержимого JSON во входных данных. Предполагается, что документ JSON начинается с первой строки, в которой первым символом является {
.
Сценарий сначала сохраняет входные данные во временный файл (, который удаляется после завершения сценария ), а затем дважды анализирует этот файл. Один раз, чтобы извлечь не -данные JSON, а затем еще раз, чтобы извлечь документ JSON.
#!/bin/sh
tmpfile=$(mktemp)
trap 'rm -f "$tmpfile"' EXIT
cat >"$tmpfile"
sed -n '/^[^{]/{p;d;}; q' <"$tmpfile"
sed -n '/^{/,$p' <"$tmpfile" | jq.
Тестирование:
$ sh script.sh <file.json
non-json text
on two lines
{
"name": "myapp",
"hostname": "myhost.local",
"pid": 64662,
"source_file_path": "/path/to/src/connector.js",
"req_id": "2339717c-6c3b-4e51-a4b2-5c647efd9c25",
"connector": "abc123",
"level": "INFO",
"req": {
"method": "GET",
"url": "http://backend/server/url"
},
"time": "2016-09-01T06:31:55.099Z",
"v": 0,
"message": "Outgoing request"
}
Если использование временного файла кажется неэлегантным, тогда следующий вариант берет путь к входному файлу из командной строки:
#!/bin/sh
infile=$1
sed -n '/^[^{]/{p;d;}; q' <"$infile"
sed -n '/^{/,$p' <"$infile" | jq.