Могу ли я добавить строки во входной файл для xargs, когда он уже запущен?

jq '.| to_entries | map(.key,.value.scores)' 

Это ответ, который я придумал, но, возможно, есть -стильный способ сделать это.

0
12.03.2021, 19:52
2 ответа

Вы можете запустить его под strace, чтобы посмотреть, что происходит:

$ seq 10 > files.txt
$ strace -tt -e read xargs -t -P 4 -n1 -d'\n' -a files.txt sleep
[...]
18:19:32.907311 read(3, "1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n", 512) = 21
sleep 1
18:19:32.908129 read(4, "", 4)          = 0
sleep 2
18:19:32.908830 read(4, "", 4)          = 0
sleep 3
18:19:32.909406 read(4, "", 4)          = 0
sleep 4
18:19:32.909977 read(4, "", 4)          = 0
18:19:33.912774 --- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid=453051, si_uid=1000, si_status=0, si_utime=0, si_stime=0} ---
sleep 5
18:19:33.914702 read(4, "", 4)          = 0
18:19:34.910440 --- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid=453052, si_uid=1000, si_status=0, si_utime=0, si_stime=0} ---
sleep 6
18:19:34.911021 read(4, "", 4)          = 0
18:19:35.911315 --- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid=453053, si_uid=1000, si_status=0, si_utime=0, si_stime=0} ---
sleep 7
18:19:35.912257 read(4, "", 4)          = 0
18:19:36.912158 --- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid=453054, si_uid=1000, si_status=0, si_utime=0, si_stime=0} ---
sleep 8
18:19:36.912623 read(4, "", 4)          = 0
18:19:38.916348 --- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid=453176, si_uid=1000, si_status=0, si_utime=0, si_stime=0} ---
sleep 9
18:19:38.917196 read(4, "", 4)          = 0
18:19:40.913135 --- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid=453177, si_uid=1000, si_status=0, si_utime=0, si_stime=0} ---
sleep 10
18:19:40.914137 read(4, "", 4)          = 0
18:19:40.914808 read(3, "", 512)        = 0
18:19:42.914324 --- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid=453178, si_uid=1000, si_status=0, si_utime=0, si_stime=0} ---
18:19:44.914685 --- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid=453179, si_uid=1000, si_status=0, si_utime=0, si_stime=0} ---
18:19:47.919202 --- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid=453272, si_uid=1000, si_status=0, si_utime=0, si_stime=0} ---
18:19:50.916332 --- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid=453273, si_uid=1000, si_status=0, si_utime=0, si_stime=0} ---
18:19:50.917068 +++ exited with 0 +++

Как видите, сначала он считывает до 512 байт данных, что в моем случае достаточно для чтения всего содержимого файла (21 байт ), затем запускает 4 процесса.

Как только возвращается первая из этих sleepкоманд, она запускает следующую.

Когда он запустил все команды, вытекающие из того, что он прочитал изначально, он read()снова s из этого файлового дескриптора 3, который ничего не возвращает, что означает конец -из -файла , после чего больше не читается.

Таким образом,xargs(GNU xargsздесь, поскольку -P, -dспецифичны для GNU, )будет считывать дополнительные данные только в том случае, если они были добавлены до того, как xargsзапустит свою последнюю команду.

Если вы хотите всегда иметь возможность добавить больше данных и убедиться, что xargsчитает их, вы можете изменить его на:

xargs -t -P 4 -n1 -d'\n' -a <(tail -fn +1 files.txt) sleep

(предполагается оболочка с поддержкой подстановки процессов -, таких как ksh, zsh или bash)

На этот раз xargsбудет читать из канала, который никогда не закончится (конец -файла -никогда не будет виден на нем ). tail -f, и в результате xargsбудет вечно ждать поступления новых данных из этого файла.

2
18.03.2021, 22:25

Я только что провел эксперимент. Я сделал небольшой скрипт оболочки, который выглядит так

echo $1
sleep 1m

У меня был такой файл конфигурации

one
two
three
four

Затем я начал команду с

xargs -t -P 4 -L 1 -a input_lines.txt./run2.sh

После запуска я изменил входной файл _lines.txt, чтобы он выглядел так

one
two
three
four
five

Выполнение завершено, и он только выводит

./run2.sh one
./run2.sh two
one
./run2.sh three
two
./run2.sh four
three
four

В совокупности это показывает, что xargs считывает входной файл, указанный -в командной строке, во время выполнения и использует -то, что вы не можете изменять файл во время выполнения, и отражаются измененные входные данные при выполнении.

три четыре

0
18.03.2021, 22:25

Теги

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