Насколько я понимаю, может быть две проблемы.
Файл правил udev
$ cat 080-model-m.rules
ACTION=="add", ATTRS{idVendor}=="04d9", ATTRS{idProduct}=="1400", RUN+="/bin/sh /home/rob/home/scripts/caps-equals-super.sh"
ACTION=="remove", ATTRS{idVendor}=="04d9", ATTRS{idProduct}=="1400", RUN+="/bin/sh /home/rob/home/scripts/revert-keyboard-to-default.sh"
Обратите внимание на / bin / sh
в начале RUN
. Кроме того, еще раз проверьте путь к сценарию оболочки.
Также после внесения изменений в правила udev обязательно выполните триггер udevadm
, чтобы правила udev были перезагружены
Основываясь на предложениях Дэниела и Стефана Чазеласа, я остановился на одном решении, которое я смог найти:
function hugepipe {
perl -MFcntl -e 'fcntl(STDOUT, 1031, 1048576) or die $!; exec { $ARGV[0] } @ARGV or die $!' "$@"
}
Это позволяет сделать:
hugepipe <command> | <command>
и канал между двумя командами будет иметь емкость, указанную через fcntl
в сценарии perl.
записи через пропускную способность канала по умолчанию все равно потребуют пробуждения команды нисходящего потока
Если ваша цель не состоит в том, чтобы слишком часто активировать команду нисходящего потока, сделал вы пытаетесь использовать параметр -p
для буфера
? Это должно заставить буфер
удерживать записи до тех пор, пока буфер не будет заполнен до определенного процента. Вам также может понадобиться опция -s
для записи больших блоков.
Обновление: О, трубы между командами все еще ограничивают возможности. Возможно, попробуйте использовать следующую программу-адаптер:
#define _GNU_SOURCE
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
int main(int argc, char** argv)
{
fcntl(atoi(argv[1]), F_SETPIPE_SZ, atoi(argv[2]));
execvp(argv[3],argv+3);
while (1);
}
как в:
adapter 1 (BIGSIZE) cmd1 | cmd2
или даже:
adapter 1 (BIGSIZE) cmd1 | adapter 1 (BIGSIZE) buffer [args] | cmd2
, если cmd1
по-прежнему выполняет небольшие записи.