grep
имеет опцию --line-buffered
для немедленного вывода каждой строки вместо ожидания ввода дополнительных данных.
Для xargs
, как предложил @ikkachu, вам нужно разделять символы новой строки вместо пробелов. Вы можете использовать xargs -L
для этого.
Это должно работать:
tail -f /var/log/syslog \
| grep --line-buffered arpwatch \
| xargs -L1 sendxmpp username@jabber.server
Процитированный вами блок кода является особым случаем, как объяснено в опущенных комментариях:
* We're waking current, this means 'p->on_rq' and 'task_cpu(p)
* == smp_processor_id()'. Together this means we can special
* case the whole 'p->on_rq && ttwu_remote()' case below
* without taking any locks.
Поскольку пробуждаемая задача является текущей задачей, она уже находится в очереди выполнения (p->on_rq
), поэтому ее не нужно добавлять в одну.
Добавление задачи в очередь выполнения рассматривается далее:
cpu = select_task_rq(p, p->wake_cpu, SD_BALANCE_WAKE, wake_flags);
Это добавляет задачу в очередь выполнения и возвращает ЦП, на котором она запланирована, поэтому при необходимости можно выполнить миграцию.
Условие #ifdef CONFIG_SMP
заслуживает некоторого объяснения, :если SMP не поддерживается, то несколько задач не могут выполняться одновременно, и, поскольку мы знаем, что не пробуждаем текущую задачу, единственный сценарий, с которым нужно иметь дело, - это ожидание ввода-вывода.