Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/apache/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
对Perl和Cron用户拥有的文件的权限被拒绝_Perl_Apache_Logging_Cron_Permission Denied - Fatal编程技术网

对Perl和Cron用户拥有的文件的权限被拒绝

对Perl和Cron用户拥有的文件的权限被拒绝,perl,apache,logging,cron,permission-denied,Perl,Apache,Logging,Cron,Permission Denied,我搜索了很多地方,没有找到任何像这样的东西 我有一个由“apache”拥有并可写的日志文件,它位于一个同样由“apache”拥有并可写的目录中: 我有一个Perl程序“load.pl”,包含以下内容: my $log = "/var/log/apache2/load.log"; my $error = ""; #...doing useful stuff here, where $error might get set if ($error && $log) { if

我搜索了很多地方,没有找到任何像这样的东西

我有一个由“apache”拥有并可写的日志文件,它位于一个同样由“apache”拥有并可写的目录中:

我有一个Perl程序“load.pl”,包含以下内容:

my $log = "/var/log/apache2/load.log";
my $error = "";

#...doing useful stuff here, where $error might get set

if ($error && $log)
{
    if (open (LOG, '>>$log'))
    {
            print LOG "[".localtime(time)."] ".$error."\n";
            close (LOG);
    }
    else
    {
            my $reason = $!;
            $error .= "Could not open log file as ".getpwuid($>)." (really ".getpwuid($<)."): $reason";

            my $subject = "load.pl could not write to $log";
            $error .= email($mailto, $replyto, $subject, $error);
    }
}
Load.txt获取STDOUT,这是从JavaScript调用的JSON格式的一些网站负载统计信息,而捕获到的任何错误都应该写入Load.log。除了写日志,一切都很好

我收到了以下输出的电子邮件

Subject: load.pl could not write to /var/log/apache2/load.log
Could not open log file as apache (really apache): Permission denied

很明显,Perl以“apache”的形式执行这个程序——既有效又真实。但是在apache拥有的目录中,我对apache拥有的文件的权限被拒绝。

还有两件事要尝试:

lsattr /var/log/apache2/load.log
这将检查日志文件的扩展区域。其中一个属性是不可变的,它使文件成为用户权限的只读属性


这将向您显示SELinux上下文,并且仅与基于RedHat/Harded Gentoo的发行版相关(在这种情况下,您还应在系统日志中收到更多错误和警告)

使用单引号不会扩展变量:

if (open (LOG, '>>$log'))

请改用双引号。

如果直接使用用户apache而不是通过cron执行脚本是否有效?好问题!上面的cron部分可能是多余的信息,因为如果我运行
sudo-u apache load.pl
,也会发生同样的情况。以root身份运行也不起作用,但它不是拒绝权限,而是说:
无法以root身份打开日志文件(真正的root):设备的ioctl不合适。这个“设备不合适的ioctl”实际上不是公开的,而是印刷的。愚蠢的,愚蠢的我!我真的明白了这一点,来发布解决方案,发现你比我抢先一步。这就是我懒惰的结果,我从其他地方复制了一段代码,却没有意识到我用一个变量替换了一个硬编码的文件名。你不会相信这让我难堪了多久。我只是无法解决权限问题,因为它与权限无关。希望这能帮助其他人比我更快地认识到这一点。
lsattr /var/log/apache2/load.log
ls -Z /var/log/apache2/load.log
if (open (LOG, '>>$log'))