
私は Linux ボックスを徹底的に破壊した後でこの質問をしています。私の考えがどのようなものかを理解していただくために、背景を少し説明させてください。
私は現在、Apache で実行している RedHat Linux ボックスを所有しています (以前は所有していました)。このボックスには Phusion Passenger が追加されており、Apache で Ruby アプリを実行できます。このアプリは、キャッシュされたファイルをシンシナティ地域のキオスクに定期的に提供するサービスとして機能します。Web アプリは問題なく動作し、残された作業は、キャッシュする必要のあるすべての情報を取得して、キオスクに提供するためのいくつかの異なる更新パッケージにパッケージ化する cron タスクを設定することだけでした。これを実現するために、データの取得とパッケージ化を処理する Ruby スクリプトを作成しました。cron タスクを設定するには、組み込みの crontab を使用しました。スクリプトは次のようになります。
#!/bin/bash
cd ../lib
ruby pdf_cache.rb
ruby pdf_prepare.rb
ruby rss_cache.rb
ruby nightly-pack.rb
cd ..
chown -R www.www *
このスクリプトは cron フォルダにあり、ディレクトリ構造は次のようになります。
.
|-- cron
|-- feeds
|-- lib
| `-- trash
|-- logs
|-- nightly-packs
|-- pdf
| `-- tank
|-- public
`-- tmp
そして、私は次の内容でcrontab -e
実行しました:root
0 3 * * * /usr/local/apache2/ruby_projects/kiosk/cron/schedule_job
これは、毎日午前 3 時にスクリプトを実行するはずです。この cron タスクをスケジュールした翌日、非常に残念な驚きがありました。cron タスクはルートで実行され、chmod -R www.www *
システム内のすべての所有権をユーザーに変更するコマンドを除いて、ほとんどのコマンドが失敗したと思われますwww
。
私の質問は、cron タスクを実装する適切な方法と、cron タスクが実行されるコンテキストは何かということです。このアカウントでこれを実行するべきではないことが今ではわかっていますが、そのユーザーにはシェルがなく、そのユーザーに正常にアクセスできないためroot
、このアカウントでこれを実行する方法がわかりません。www
su
www
答え1
ユーザーにシェルを与えて、リモートでアクセスする機能とその権限を制限するだけで済むと思います。
Cron タスクは、Cron タスクを作成したユーザーの下で実行されるため、 として実行されますroot
。
答え2
もう 1 つの提案:-e
このようなスクリプトの shebang 行に を追加します (つまり#!/bin/bash -e
)。これにより、スクリプト内のいずれかのコマンドが失敗した場合にスクリプトが終了します。不快な驚きが起こらないことを保証するものではありませんが、スクリプトが完全に軌道から外れることを防ぎ (いわば)、さまざまな種類の連鎖反応による障害を防止します。
答え3
これを行う適切な方法は、「su -」で、cronjob をこのユーザーとして設定することです。その後、このユーザーとして実行されます。または、使用している cron デーモンによっては、ユーザーを定義する 6 番目のフィールドがある場合があります。
これが役に立つことを願っています。他のハックもありますが、適切に動作させることが常に最善です。