Menyiapkan pekerjaan cron yang melakukan chmod / chown

9

Saya ingin mengatur pekerjaan cron yang secara cerdik melakukan chmod / chown pada direktori (direktori dropbox).

Ini berfungsi ketika saya menjalankan perintah secara manual seperti:

sudo chown -R $USER ~/Dropbox
sudo chmod -R u+rw ~/Dropbox

Saya mencoba mengubahnya menjadi pekerjaan cron seperti ini:

10      *       *       *       *       sudo chown -R $USER ~/Dropbox

Tapi sepertinya itu tidak berhasil.

Bagaimana cara melakukannya?

tvgemert
sumber
incron+ inotifyakan menjadi solusi yang lebih bersih :)
franzlorenzon

Jawaban:

9

Anda ingin skrip root cron Anda (edit dengan menjalankan sudo crontab -e) menjadi:

 55 * * * * /bin/chown -R somename /home/somename/Dropbox && /bin/chmod u+rw /home/somename/Dropbox

Dengan asumsi pengguna bernama somenamedan itu /home/somename/Dropboxadalah path lengkap dari direktori Dropbox Anda. Sebagai pengguna root, ~ pergi ke /root.

dr jimbob
sumber
1
Terima kasih atas jawaban yang jelas! Saya pikir ini menunjukkan kepada saya beberapa tautan yang hilang yang saya cari. Saya akan mengujinya besok pagi :)
tvgemert
Mengujinya, dan itu berhasil!
tvgemert
2
Bagus; senang bekerja. Pelajarannya adalah (a) jangan berharap variabel lingkungan ingin $PATHdidefinisikan setara dengan yang ada pada pengguna yang masuk dalam cronjob (mis., Di linuxbox saya $ HOME didefinisikan, tetapi $ PATH diatur ke /usr/bindan /bindari crontab dan $ USER tidak didefinisikan, jadi dalam hal ini Anda tidak perlu menentukan /binsebelum chmod / chown), (b) hindari sudodalam skrip (jalankan tugas cron sebagai rootpengguna), (c) sebagai pengguna root $HOMEakan merujuk ke / root bukan pengguna normal Anda , (d) ~harus dihindari dalam skrip cron (secara default dijalankan sebagai #!/bin/sh.
dr jimbob
Saya juga merekomendasikan untuk memasukkan naskah sesuai saran David jika Anda pernah melakukan sesuatu yang lebih rumit dari ini; skrip tampaknya berlebihan untuk kombinasi chmod / chown. Namun, jika Anda mulai mendaftar ke Dropbox pengguna lain atau direktori lain atau memutuskan untuk hanya berjalan di file yang baru saja diubah (misalnya, hasil find), dll daripada masuk akal untuk dimasukkan ke dalam skrip.
dr jimbob
16

sudoseharusnya hampir tidak pernah digunakan dalam tugas yang dijadwalkan. Itu mengharapkan untuk dapat berbicara ke terminal, dan memerlukan bendera khusus untuk menghindari mencoba melakukannya.

Buat pekerjaan cron Anda sebagai root (di /etc/crontab- Perhatikan bahwa format file ini sedikit berbeda :). Ini juga bermanfaat untuk bekerja pada sistem yang tidak diinstal.minute hour mday month wdayusercommand
sudo

voretaq7
sumber
Terima kasih! Saya membuat ini, tapi saya masih tidak yakin tentang itu. Saya tidak mendapatkan hasil yang diharapkan: 55 * * * * root chown -R somename ~/Dropbox
tvgemert
3
somenamebisa dimana saja; ini adalah jalan yang relatif. Kedua, ~hanya dipahami oleh shell; gunakan $HOME. Gunakan perintah seperti ini: chown -R /some/path/somename $HOME/Dropbox(ini akan menggunakan root's direktori home ...)
Mei
@ David: somenamebukan jalan, tetapi nama pengguna (dan juga harus mengandung nama grup somename:somegroup
:)
5
@tvgemert Apa yang dikatakan David di atas (dan dalam jawabannya) mengenai jalur / jalur relatif / jalur simbolik ( ~) secara KRITIS PENTING - Harap luangkan waktu dengan halaman manual cron dan crontab dan pastikan Anda memahami apa yang terjadi (jika ragu-ragu) , buat cron job yang berfungsi echo "what you want to do" > /tmp/what-i-would-rundan lihat hasilnya untuk memastikan mereka waras - JAUH peluang lebih sedikit untuk menghancurkan alam semesta.)
voretaq7
Terima kasih atas tips yang bermanfaat, beri saya lebih banyak wawasan!
tvgemert
6

Dua masalah:

1) Path biasanya tidak diatur dalam cron dengan cara yang sama ketika Anda login. Coba / usr / bin / sudo / bin / chown ... (atau apa pun jalur yang benar untuk program-program di sistem Anda).

2) sudo biasanya meminta kata sandi Anda, atau mungkin tidak senang berjalan tanpa interaksi. Saya sarankan Anda meletakkan perintah di root crontab tanpa sudo sebagai gantinya, maka perintah dijalankan sebagai root.

pjc50
sumber
5

Ada beberapa masalah dengan crontab Anda:

10 * * * sudo chown -R $USER ~/Dropbox

Masalah:

  • sudotidak boleh digunakan di sini; membutuhkan input terminal
  • chownharus ditentukan secara lengkap (yaitu, /bin/chown)
  • USERsebagai variabel aktual mungkin tidak ada; beberapa sistem digunakanLOGNAME
  • ~(tilde) hanya akan dikenali oleh shell - telanjang chowntidak akan memahaminya
  • menentukan HOME di crontab root pergi ke root

Saya pikir saya akan menuliskannya:

#!/bin/bash

# FILE: /usr/local/bin/myscript

USER=$1
eval chown -R $1 ~$1/Dropbox
eval chmod -R u+rw ~$1/Dropbox

( evalDiperlukan untuk mengonversi ~$1ke ~user lalu ke /home/user.)

Jalankan skrip ini dari crontab root:

# root's crontab
10 * * * /usr/local/bin/myscript someuser
Mei
sumber