wp.​​cli 和 sendmail 无法通过 cron 工作,但在手动运行时可以工作

wp.​​cli 和 sendmail 无法通过 cron 工作,但在手动运行时可以工作

不确定这是否属于 Wordpress Stackexchange 或此处。我认为这里我的代码中的最后一行不是 WordPress 特定的。

我在 .sh 文件中有以下代码,我每周使用 Cron 运行该代码。

该代码会遍历我的所有站点,查找站点是否为 Wordpress,如果是,则运行 wp.cli 来更新 Wordpress、插件和主题。

它将脚本的输出记录到文件中,然后通过电子邮件将该文件发送给我。

如果我从命令行手动运行它,它工作得很好。我通过 cron 手动运行以下命令:

sh /home/update_all_wp_sites.sh > /dev/null 2>&1

如果我通过 cron 运行此命令,则 wp.cli 命令不会运行,末尾的 sendmail 行也不会运行。

我知道 cron 没问题,并且脚本通过 cron 运行,因为我的日志文件仍然每周创建,它仍然在我的注释中添加标识正在运行的站点。它不会像手动运行时那样添加 wp.cli 命令的输出。

起初我以为可能是 tee 的问题,但最后的 sendmail 行不使用 tee。

#!/bin/bash


cd /home
cat /dev/null > update_all_wp_sites.log
echo "AC2"  | tee -a update_all_wp_sites.log
echo '----------------'  | tee -a update_all_wp_sites.log
for user in * ; do
    
    for d in $user/public_html ; do
        count_file=`ls -1 $d/wp-config.php 2>/dev/null | wc -l`
        if [ "$count_file" != "0" ]
        then 
            echo '----------------'  | tee -a update_all_wp_sites.log
            echo $user  | tee -a update_all_wp_sites.log
            echo '----------------'  | tee -a update_all_wp_sites.log
            sudo -u $user -i -- /opt/rh/rh-php70/root/usr/bin/php /usr/local/bin/wp core update --path=/home/$d  | tee -a update_all_wp_sites.log
            sudo -u $user -i -- /opt/rh/rh-php70/root/usr/bin/php /usr/local/bin/wp plugin update --all --path=/home/$d  | tee -a update_all_wp_sites.log
            sudo -u $user -i -- /opt/rh/rh-php70/root/usr/bin/php /usr/local/bin/wp language core update --path=/home/$d  | tee -a update_all_wp_sites.log
            sudo -u $user -i -- /opt/rh/rh-php70/root/usr/bin/php /usr/local/bin/wp theme update --all --path=/home/$d  | tee -a update_all_wp_sites.log
        fi 
    done
    
    for d2 in $user/domains/*/public_html ; do
        count_file=`ls -1 $d2/wp-config.php 2>/dev/null | wc -l`
        if [ "$count_file" != "0" ]
        then 
            echo '----------------'  | tee -a update_all_wp_sites.log
            echo $user  | tee -a update_all_wp_sites.log
            echo '----------------'  | tee -a update_all_wp_sites.log
            sudo -u $user -i -- /opt/rh/rh-php70/root/usr/bin/php /usr/local/bin/wp core update --path=/home/$d  | tee -a update_all_wp_sites.log
            sudo -u $user -i -- /opt/rh/rh-php70/root/usr/bin/php /usr/local/bin/wp plugin update --all --path=/home/$d  | tee -a update_all_wp_sites.log
            sudo -u $user -i -- /opt/rh/rh-php70/root/usr/bin/php /usr/local/bin/wp language core update --path=/home/$d  | tee -a update_all_wp_sites.log
            sudo -u $user -i -- /opt/rh/rh-php70/root/usr/bin/php /usr/local/bin/wp theme update --all --path=/home/$d  | tee -a update_all_wp_sites.log
        fi 
    done
    
done

echo -e "Subject: AC2 WP Updates Log" | sendmail -v [email protected] < update_all_wp_sites.log

谢谢

注意:我使用 rh-php70 作为较旧的服务器,以防有人问起,我无法在其上获取 PHP 7.4。

更新:在服务器管理控制台中运行 cron 会显示以下内容:

sudo: sorry, you must have a tty to run sudo
sudo: sorry, you must have a tty to run sudo
sudo: sorry, you must have a tty to run sudo
sudo: sorry, you must have a tty to run sudo
Mail Delivery Status Report will be mailed to <root>

答案1

根本原因是更新中报告的问题:

sudo: sorry, you must have a tty to run sudo

根据以下帖子,我已在 /etc/sudoers 中注释掉了 Defaults requiretty,现在它可以工作了:

如果我可以在没有密码的情况下执行 sudo,为什么还需要 tty 来运行 sudo?

相关内容