Rsync имеет код, который конкретно проверяет, является ли файл усеченным во время чтения и дает эту ошибку — ENODATA
. Я не знаю почему файлы в /sys
имейте это поведение, но так как они не реальные файлы, я предполагаю, что это не слишком удивительно. Кажется, нет способа сказать rsync пропускать эту конкретную проверку.
Я думаю, что Вы, вероятно, более обеспечены не rsyncing /sys
и с помощью определенных сценариев, чтобы избирательно подойти к выбору особой информации Вы хотите (как адрес сетевой платы).
Это пример. Играйте с этим, чтобы получить именно то, что вам нужно. Это не может сломаться так, как есть.
#!/bin/bash
# Example of killing off all children
> killfile
> outfile.err
kill_em()
{
echo 'killing all children ' > 2
while read pid
do
kill -0 $pid && kill -9 $pid # if still running kill it
done < killfile
exit 1
}
export grandparentpid=$$
trap 'kill_em' 6
for i in 2 2 3 4 5 6 7 8 9 10
do
( sleep $i && ls oinkle >> outfile 2>> outfile.err &
pid=$!
echo $pid >> killfile
wait $!
[ $? -ne 0 ] && kill -6 $grandparentpid
) &
done
wait
Это установлено значение, чтобы убедиться, что Ls oinkle
не удастся (на моей машине).
Когда вы получаете то, что вам нужно после Tinking с помощью сценариев стартера --- Изменить:
for i in 2 2 3 4 5 6 7 8 9 10
:
for part in input_*
Изменение:
sleep $i && ls oinkle
:
python3 $part
Перенаправления, чтобы сохранить журналы. Вы не можете их захотеть.
Я полагаю, что это связано с шрифтом. В текстовом режиме используются различные шрифты, чем в X. Простое гуглинг говорит, что это может быть невозможно достичь в текстовом методе Arch Linux forum и LFS Console
-121--230125- Так, как указывает @ muru в Я управлял всем этим, но часть unlockpt ()
. В соответствии с чем-то, что я прочитал здесь , возможно, есть некоторые параметры компиляции времени в ядре для отключения вновь созданной блокировки pty, но я не хотел этого делать. Итак, я сделал что-то другое.
На самом деле мне не нужен grantpt ()
. В соответствии с приведенным здесь описанием все, что он делает, это изменяет UID/GID для файла устройства /dev/pts/[ num]
. Но согласно человеку
есть более простые способы справиться с этим. Ниже приведены некоторые опции монтирования devpts
:
uid = value
и gid = value
gid = 5
приведет к тому, что вновь созданные PTY будут принадлежать группе tty . Это уже было в моей системе по умолчанию. Но прочитав, я понял, что, возможно, захочу все-таки изменить. Следующий раздел гласит:
ptmxmode = value
devpts
. devpts
(см. опцию newinstance
выше) каждый экземпляр имеет частный узел ptmx в корне devpts
файловой системы (обычно /dev/pts/ptmx
) . 0000
. ptmxmode = value
указывает более полезный режим для узла ptmx и настоятельно рекомендуется, когда задан параметр newinstance
. Несмотря на то, что это сработало бы без этого, мне понравилась идея и я установил ее на 0640
, как рекомендовано в документации по ядру . Ссылка kernel doc, по пути, развивает опцию newinstance
mount - что довольно круто и в основном позволяет получить отдельно разнесенную по имени группу ptys на /dev/ptmx
mount.
В любом случае, так что что-то еще было в основном:
mount -o remount,newinstance,gid=5,ptmxmode=0640 /dev/pts
mount --bind /dev/pts/ptmx /dev/ptmx
... как ядро документы рекомендуют - см. ссылку о том, почему. Я также сделал эффект вышеуказанных команд постоянным, добавив пару строк в мой /etc/fstab
.
И...
<<\C cc -xc - -o pts
#include <stdio.h>
int main(int argc, char *argv[]) {
if(unlockpt(0)) return 2;
char *ptsname(int fd);
printf("%s\n",ptsname(0));
return argc - 1;
}
C
Которая просто компилирует крошечную маленькую программу C, которая пытается вызвать unlockpt ()
на своем stdin и если успешно напечатает имя вновь созданной и разблокированной pty в stdout
или в противном случае молча возвращает 2.
Как только это было сделано, я мог создать свои собственные экранированные процессы, такие как:
exec 3<>/dev/ptmx
... чтобы получить главную сторону fd в текущей оболочке тогда...
(setsid -c "$0" -i 2>&1|tee log) <>"$(./pts <&3)" 3>&- >&0 &
На другом конце псевдотерминала в фоновом режиме выполняется интерактивная оболочка. Он интерпретирует все, что напечатано на > & 3
, как пользовательский ввод.
mikeserv@localhost$ echo echo hey >&3
mikeserv@localhost$ cat log
$ hey
$
mikeserv@localhost$ echo echo hey >&3
mikeserv@localhost$ cat log
$ hey
$ hey
$
Который в основном связывает меня фоновый, протоколированный, интерактивный интерпретатор (или что-либо еще, что я могу хотеть, чтобы запустить на этих) ala экран
без столько накладных расходов и на любой файл дескриптор я выбираю.
Ведущая сторона fd, принадлежащая моей текущей оболочке, является единственным средством обслуживания входа ведомой стороны и может быть записана только моим текущим процессом оболочки (и его дочерними) . Я могу связаться с другой стороной, написав в > & 3
, и я могу либо читать из того же или из файла журнала, как я хочу.
И stty
работает на терминале:
mikeserv@localhost$ echo stty -a ">$(tty)" >&3
speed 38400 baud; rows 0; columns 0; line = 0;
intr = ^C; quit = ^\; erase = ^?; kill = ^U; eof = ^D; eol = <undef>; eol2 = <undef>;
swtch = <undef>; start = ^Q; stop = ^S; susp = ^Z; rprnt = ^R; werase = ^W;
lnext = ^V; flush = ^O; min = 1; time = 0;
-parenb -parodd -cmspar cs8 -hupcl -cstopb cread -clocal -crtscts
-ignbrk -brkint -ignpar -parmrk -inpck -istrip -inlcr -igncr icrnl ixon -ixoff -iuclc
-ixany -imaxbel -iutf8
opost -olcuc -ocrnl onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0
isig icanon iexten echo echoe echok -echonl -noflsh -xcase -tostop -echoprt echoctl
echoke
-121--74182- Можно использовать группу процессов:
set -m
(
for part in input_*; do
(python3 "$part" || kill 0) &
done
wait
)
set -m
(и дополнительная функция оболочки POSIX, обязательная функция оболочки Unix) запускает задания в собственной группе процессов. В bash
, yash
, zsh
, mksh
, это задания субоболочки, где set -m
включен, поэтому внешний (...)
и все процессы, созданные в этой группе, будут помещены в ту же группу процессов.
Для тире
и других оболочек на основе золы
, которые работают только в процессе оболочки верхнего уровня. Так что этот код будет работать, если он не помещен в дополнительный корпус.
Это не будет работать в AT & T ksh
или старой оболочке SysV/Bourne вообще.
kill 0
посылает сигнал SIGTERM всем участникам текущей группы процессов.