シェルスクリプトは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つのファイルが生成され、何が起こっているのかを確認できます。

答え2

rebootログイン後にルート以外のユーザーとして直接実行できる場合は、物理的にログインしたユーザーがシステムを再起動できるようにシステムが構成されているためです。これは次の方法で行うことができます。ポルキット

crontabによると、ログインセッションにはありません。システムを再起動するには、cronジョブをrootとして実行する必要があります。

再起動がネットワークインタフェースを作成する解決策ではないと思います。 VPNを起動するには通常電話をかけます。そして、これを行うにはおそらくルートである必要があります(ネットワークインターフェイスを設定するにはルートである必要があるため、rootとしてvpnrestart1.sh実行するか、setuidプログラム(重要セクションのsudoなど)を介してroot権限を取得する必要があります)。特定のユーザーセッションがシステム構成に影響を与えるように、Polkitを使用するNetworkManagerに委任します。

答え3

シェルスクリプトでは、相対パスの代わりにフルパスを使用します。これは私の問題を解決しました。

関連情報