Запланировать задание в Linux, которое не запускается после пробуждения

Предполагая наличие 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.
1
11.06.2021, 18:40
1 ответ

Таймеры — это то, что вам нужно!

systemctl list-timers

перечисляет текущие активные таймеры. На самом деле у Arch есть хорошая статья о них; вы можете прокрутить вниз до места, где они демонстрируют блоки переходного таймера:

systemd-run --on-active="12h 30m" /bin/touch /tmp/foo

касается файла /tmp/foo после двенадцати с половиной часов активности.

0
28.07.2021, 11:25

Теги

Похожие вопросы