Если какие-либо порожденные дочерние процессы приводят к сбою, уничтожают все и выход

Rsync имеет код, который конкретно проверяет, является ли файл усеченным во время чтения и дает эту ошибку — ENODATA. Я не знаю почему файлы в /sys имейте это поведение, но так как они не реальные файлы, я предполагаю, что это не слишком удивительно. Кажется, нет способа сказать rsync пропускать эту конкретную проверку.

Я думаю, что Вы, вероятно, более обеспечены не rsyncing /sys и с помощью определенных сценариев, чтобы избирательно подойти к выбору особой информации Вы хотите (как адрес сетевой платы).

9
14.01.2015, 21:18
2 ответа

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

#!/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 

Перенаправления, чтобы сохранить журналы. Вы не можете их захотеть.

3
27.01.2020, 20:06

Я полагаю, что это связано с шрифтом. В текстовом режиме используются различные шрифты, чем в X. Простое гуглинг говорит, что это может быть невозможно достичь в текстовом методе Arch Linux forum и LFS Console

-121--230125-

Так, как указывает @ muru в Я управлял всем этим, но часть unlockpt () . В соответствии с чем-то, что я прочитал здесь , возможно, есть некоторые параметры компиляции времени в ядре для отключения вновь созданной блокировки pty, но я не хотел этого делать. Итак, я сделал что-то другое.

На самом деле мне не нужен grantpt () . В соответствии с приведенным здесь описанием все, что он делает, это изменяет UID/GID для файла устройства /dev/pts/[ num] . Но согласно человеку есть более простые способы справиться с этим. Ниже приведены некоторые опции монтирования devpts :

  • uid = value и gid = value
    • . Это устанавливает для владельца или группы вновь созданных PTY указанные значения. Если ничего не указано, для них будут установлены UID и GID процесса создания. Например, если существует группа tty с GID 5, то gid = 5 приведет к тому, что вновь созданные PTY будут принадлежать группе tty .

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

  • ptmxmode = value
    • Наборов режим для нового узла устройства ptmx в файловой системе devpts .
    • При поддержке нескольких экземпляров devpts (см. опцию newinstance выше) каждый экземпляр имеет частный узел ptmx в корне devpts файловой системы (обычно /dev/pts/ptmx ) .
    • Для совместимости со старыми версиями ядра по умолчанию используется режим нового узла 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 всем участникам текущей группы процессов.

10
27.01.2020, 20:06

Теги

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