쉘 스크립트는 Cron으로 실행되지 않고 수동으로 실행됩니다.

쉘 스크립트는 Cron으로 실행되지 않고 수동으로 실행됩니다.

나는 모든 것을 시도한 것 같습니다. Google에 약 20페이지의 검색 기록이 있으며 이 문제를 해결하려고 노력했지만 아무것도 효과가 없었습니다. 기본적으로 tun0 인터페이스가 있는지 확인하고, 없으면 컴퓨터가 재부팅되는 스크립트가 있습니다. 코드는 다음과 같습니다.

#!/bin/bash
. /etc/profile
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
if echo `ifconfig` | grep -q "tun0"
then echo ""
else
    reboot
fi

해당 경로를 사용하여 터미널에서 스크립트를 호출하면 스크립트 자체가 제대로 실행됩니다.

/scripts/vpnrestart1.sh

crontab -e 상단에 다음을 추가했습니다.

SHELL=/bin/bash
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

내 크론 작업은 다음과 같습니다.

* * * * * /scripts/vpnrestart1.sh

스크립트 자체에는 훌륭한 권한이 있으며 sudo 없이 실행될 수 있습니다. 앞서 언급했듯이 터미널에서 제대로 실행되며 설계된 대로 작동합니다. 하지만 cron에 넣고 tun0 인터페이스를 삭제하면 아무 일도 일어나지 않습니다.

답변1

실행 시 어떤 일이 발생하는지 확인하기 위해 스크립트를 디버깅해 보셨나요 cron? 스크립트에 다음 코드를 삽입합니다.

# log stdout and stderr to two different files
exec >>/var/log/looog.log 2>>/var/log/looog.err.log

# ...and log every command we try to execute to stderr (aka looog.err.log)
set -x

스크립트를 실행하면 이 두 파일이 생성되며 무슨 일이 일어나고 있는지 확인할 수 있습니다.

답변2

reboot로그인 후 루트가 아닌 사용자로 직접 실행할 수 있는 경우 이는 물리적으로 로그인한 사용자가 시스템을 재부팅할 수 있도록 시스템이 구성되어 있기 때문입니다. 이 작업은 다음을 통해 수행할 수 있습니다.폴킷.

crontab에 따르면 로그인 세션에 있지 않습니다. 시스템을 다시 시작하려면 cron 작업을 루트로 실행해야 합니다.

다시 시작하는 것이 네트워크 인터페이스를 만드는 해결책은 아니라고 생각합니다. VPN을 시작하기 위해 일반적으로 전화를 걸면 됩니다. 그리고 이 작업을 수행하려면 아마도 루트여야 합니다(네트워크 인터페이스를 설정하려면 루트여야 하므로 vpnrestart1.sh루트로 실행하거나 setuid 프로그램(중요 섹션의 sudo와 같은)을 통해 루트 권한을 얻어야 합니다). 특정 사용자 세션이 시스템 구성에 영향을 미칠 수 있도록 Polkit을 사용하는 NetworkManager에 위임합니다.

답변3

쉘 스크립트에서는 상대 경로 대신 전체 경로를 사용하십시오. 이것은 내 문제를 해결했습니다.

관련 정보