wp.​​cli 및 sendmail은 cron을 통해 작동하지 않지만 수동으로 실행하면 작동합니다.

wp.​​cli 및 sendmail은 cron을 통해 작동하지 않지만 수동으로 실행하면 작동합니다.

이것이 WordPress Stackexchange에 속하는지 아니면 여기에 속하는지 확실하지 않습니다. 내 코드의 마지막 줄은 WordPress에만 해당되는 것이 아닌 것 같습니다.

Cron을 사용하여 매주 실행하는 .sh 파일에 다음 코드가 있습니다.

이 코드는 내 모든 사이트를 통과하여 해당 사이트가 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를 실행할 수 있다면 sudo를 실행하는 데 왜 tty가 필요합니까?

관련 정보