Удаление файла - это не модификация файла, это модификация каталога, содержащего файл. Если у вас нет прав на модификацию каталога, вы не можете удалить файл в этом каталоге.
Я подумал о 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;
}
Команда wait
в bash
имеет параметр -n
:
Если указана опция
-n
, ожидание завершения любого задания и возвращает свой статус выхода.
Это означает, что вы можете сделать
command1 &
command2 &
command3 &
wait -n
printf 'One command exited with exit code %d\n' "$?"
Вы можете использовать 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
он был.