Подождите несколько процессов, распечатайте код выхода, если какой-либо процесс получит выход

Удаление файла - это не модификация файла, это модификация каталога, содержащего файл. Если у вас нет прав на модификацию каталога, вы не можете удалить файл в этом каталоге.

2
27.05.2017, 01:02
3 ответа

Я подумал о wait -n в Bash, но он не позволяет узнать, какой дочерний процесс завершился. Как насчет простого Perl-скрипта?

#!/usr/bin/perl

use strict;
use warnings;
use POSIX ":sys_wait_h";

sub spawn(@) {
    my $pid = fork();
    die "fork: $!" if not defined $pid;
    if ($pid == 0) {
        exec @_ or die "exec: $!";
    }
    return $pid;
}

# Commands to run
my $p1 = spawn '/bin/bash -c "sleep 6; kill $$"';
my $p2 = spawn '/bin/bash -c "sleep 4; exit 4"';

print "spawned PIDs $p1 and $p2\n";

while ((my $child = waitpid(-1, 0)) > 0) {
    my $code = $? >> 8;
    my $status = $? & 0xff;
    printf "child %d finished with exit code %d (status/sig %d)\n", $child, $code, $status;
}
2
27.01.2020, 21:58

Команда wait в bash имеет параметр -n:

Если указана опция -n, ожидание завершения любого задания и возвращает свой статус выхода.

Это означает, что вы можете сделать

command1 &
command2 &
command3 &

wait -n
printf 'One command exited with exit code %d\n' "$?"
2
27.01.2020, 21:58

Вы можете использовать wait -n, чтобы дождаться выхода дочернего элемента, а затем проверить каждый дочерний элемент, если он все еще работает, с помощью kill -0, чтобы увидеть, какой из них только что вышел. , например:

for f in 15 10 15; do sleep $f & PIDS+="$! " ; done ; wait -n ; for f in $PIDS; do if ! kill -0 $f 2> /dev/null ; then echo $f; fi;

ожидание -n возвращает только статус выхода дочернего элемента, а не то, какой PID он был.

3
27.01.2020, 21:58

Теги

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