スケジューリング - 正しいアプローチ?

スケジューリング - 正しいアプローチ?

私はYouTubeのビデオやオンラインコースをフォローし、Linuxのコマンドを学び、スキルを向上させ、より良いものにしようとしています。現在、スケジュールを理解しようとしています。

私のRaspberry Piは、ヘッドレスRaspbianで独自のクラウドを実行しています。週に一度、owncloudをメンテナンスモードに設定し、apt-getアップデート、apt-getアップグレード、owncloudをメンテナンスモードからオフにするようにスケジュールしたいと思います。 Owncloud(php)コマンドはユーザーwww-dataで実行する必要があり、apt-getはrootとして実行する必要があります。これまで私は次のことを試しました。

sudo -u www-data crontab -e

行を追加0 7 * * 1 php /var/www/owncloud/occ maintenance:mode --on

それから

sudo crontab -e

行を追加1 7 * * 1 apt-get update && apt-get upgrade -y

しかし、ここで私は詰まっています。 apt-get Upgrade -yが終了ステータス0を返した後にメンテナンスモードでowncloudを終了するようにシステムに指示するにはどうすればよいですか?ルートのcrontabエントリを次に設定することを検討しました。

1 7 * * 1 apt-get update && apt-get upgrade && php /var/www/owncloud/occ maintenance:mode --off

ただし、Maintenance:mode --offはwww-dataユーザーが実行していないため失敗します。数分後にwww-dataとして実行するように最後のコマンドをスケジュールできますが、apt-get Upgrade -yが終了ステータス0を提供するときに実行することをお勧めします。これを行う方法はありますか?

ベストアンサー1

su友達と一緒に救いに来てください!su、、、sudoおよびsuperすべてここで使用できます。su伝統的でsudo最もシンプルで、superユーザーがこれらのタスクのいくつかを実行できるようにしたい場合は、利点があります。

apt-get upgrade終了ステータステストに具体的に言及したので1 7 * * 1 apt-get update && apt-get upgrade && sudo -u www-data php /var/www/owncloud/occ maintenance:mode --off

今、これは少し長いので、thrigの提案に従い、それをスクリプトに入れるという利点がありますが、彼の例には2つの欠点があります。戻り値を確認せず、コマンドのメンテナンスモードは次のコマンドに従います。メンテナンスモードに入るのとapt-getを起動することの間に遅延がある理由があるので、次のようなことがもっと欲しいかもしれません。

#!/bin/sh
set -e
sudo -u www-data php /var/www/owncloud/occ maintenance:mode --on || sudo -u www-data php /var/www/owncloud/occ maintenance:mode --on
sleep 1m || true
apt-get update || apt-get update
apt-get upgrade -y || apt-get install
sudo -u www-data php /var/www/owncloud/occ maintenance:mode --off || sudo -u www-data php /var/www/owncloud/occ maintenance:mode --off

しかし、あなたはすでに良い出発をしています。

おすすめ記事