Есть несколько проблем с вашим кодом:
- Похоже, вы не хотите вывод, то есть вы хотите
system
, но это очень простые шаги и, вероятно, должныбыть сделано непосредственно в Perl, вместо вызова оболочки.touch
буквально 1 вызов в Perl (2, если вы считаете закрытие файла.) - Существует условие гонки, поскольку вы создаете файл, а затем задаете его разрешения в два этапа.Так как это выглядит как файл флага, условие гонки кажется релевантным, и, таким образом, вы, вероятно, захотите атомарный create / setperms в одной команде.
- Поскольку это флаг file , вам, вероятно, нужен режим
0644
вместо 0755
.
В Perl все вышеперечисленное можно решить примерно так:
#!/usr/bin/perl
use Fcntl qw( :DEFAULT ); # Core module, for O_CREAT, etc. constants
use strict;
use warnings;
# You probably want 0644, as a flag file probably shouldn't be executable..?
sysopen( my $fh, '/tmp/flag.done', O_CREAT|O_EXCL|O_RDWR, 0644 )
# Sysopen returns a undef if unsuccessful, with an error message stored in $!
or die "$!";
# write to it here, if you need to.
close( $fh );
Вы можете поместить это в подпрограмму с помощьюкакими бы аргументами вы ни хотели создать (намного больше) атомарный шаг создания, чтобы избежать вмешательства других процессов между большим количеством вызовов, которые нужно дважды выложить для создания файла, а затем сбросить его разрешения.(Все еще есть проблемы с синхронизацией, поэтому ее все еще можно заменить, но в целом это гораздо лучшее решение.)
Есть и другие флаги, которые вы, возможно, захотите использовать.Проверьте perldoc perlopentut
и найдите sysopen
для небольшого списка, или проверьте perldoc Fcntl
и документацию вашей платформы для более полного списка.Возможно, вы также захотите изменить разрешения 0644
на что-то более и менее ограничительное, и вы также можете захотеть использовать блокировку;см. perldoc -f flock
для получения информации и примеров кода по консультативной блокировке.