Bagaimana cara menentukan di crontab oleh pengguna apa yang menjalankan skrip? [Tutup]

176

Saya memiliki beberapa pekerjaan crontab yang berjalan di bawah root, tetapi itu memberi saya beberapa masalah. Misalnya semua folder yang dibuat dalam proses pekerjaan cron itu berada di bawah root pengguna dan root grup. Bagaimana saya bisa membuatnya berjalan di bawah data-pengguna www dan kelompok data-www sehingga ketika saya menjalankan skrip dari situs web saya, saya dapat memanipulasi folder dan file tersebut?

Server saya berjalan di Ubuntu.
Pekerjaan crontab saat ini adalah:

*/1 * * * * php5 /var/www/web/includes/crontab/queue_process.php >> /var/www/web/includes/crontab/queue.log 2>&1
arma
sumber

Jawaban:

335

Alih-alih membuat crontab untuk dijalankan sebagai pengguna root, buat crontab untuk pengguna yang ingin Anda jalankan skrip. Dalam kasus Anda, crontab -u www-data -eakan mengedit crontab untuk pengguna data-www. Cukup masukkan perintah lengkap Anda di sana dan hapus dari crontab pengguna root.

Mike
sumber
54
Ini bekerja dengan cara yang sama ketika Anda gunakan crontab -esebagai pengguna tertentu.
kulak
7
Tetapi apakah crontab ini akan diperiksa saat sistem dinyalakan atau hanya ketika pengguna masuk?
Bruno Finger
11
cronpada * nix sistem tidak mengharuskan pengguna untuk masuk untuk menjalankan pekerjaan yang ditentukan dalam crontab pengguna tertentu.
Mike
2
Apakah ini juga akan mengatur id grup seperti yang diminta OP? Bagaimana jika grup yang diinginkan berbeda dari grup utama pengguna?
askyle
49

EDIT: Perhatikan bahwa metode ini tidak akan berfungsi dengan crontab -e, tetapi hanya berfungsi jika Anda mengedit / etc / crontab secara langsung. Jika tidak, Anda mungkin mendapatkan kesalahan seperti/bin/sh: www-data: command not found

Tepat sebelum nama program:

*/1 * * * * www-data php5 /var/www/web/includes/crontab/queue_process.php >> /var/www/web/includes/crontab/queue.log 2>&1
Christian Nowak
sumber
Itu akan membuatnya berjalan sebagai penyihir pengguna apache adalah www-data kan?
arma
19
Perhatikan bahwa metode ini tidak berfungsi crontab -e, tetapi hanya berfungsi jika Anda mengedit /etc/crontabsecara langsung. Baca komentar di bagian atas file ini untuk informasi lebih lanjut.
imgx64
5
Pengguna hanya dapat ditentukan dalam sistem crontab
James Roth
Saya punya beberapa pekerjaan sesuai jadwal pada sistem crontab. Ketika saya melakukannya sudo crontab -e, saya melihat pekerjaan. Tapi saya buka file /etc/crontabtidak ada pekerjaan. Apakah ini aneh? Juga jika saya sudo crontab -edan menambahkan pekerjaan dengan pengguna yang ditentukan, apakah itu akan berhasil?
eNeMetcH
14

Karena Anda menjalankan Ubuntu, crontab sistem Anda berada di /etc/crontab.

Sebagai pengguna root (atau menggunakan sudo), Anda cukup mengedit file ini dan menentukan pengguna yang harus menjalankan perintah ini. Berikut adalah format entri di crontab sistem dan bagaimana Anda harus memasukkan perintah Anda:

# m h dom mon dow user  command
*/1 * * * * www-data php5 /var/www/web/includes/crontab/queue_process.php >> /var/www/web/includes/crontab/queue.log 2>&1

Tentu saja izin untuk skrip php dan file log Anda harus diatur sehingga www-datapengguna memiliki akses ke skrip php Anda .

pymkin
sumber
Saya pikir ini harus sama dengan crontab -e; tapi tidak.
zinking
5
Ubuntu docs merekomendasikan untuk tidak mengedit / etc / crontab karena dapat ditimpa oleh pembaruan. crontab -e akan membuat file cron khusus pengguna di / var / spool / cron / crontab.
Hemm
9

Anda juga dapat mencoba menggunakan runuser(sebagai root) untuk menjalankan perintah sebagai pengguna yang berbeda

*/1 * * * * runuser php5 \
            --command="/var/www/web/includes/crontab/queue_process.php \
                       >> /var/www/web/includes/crontab/queue.log 2>&1"

Lihat juga: man runuser

Russell E Glaue
sumber
runusertidak termasuk dalam Ubuntu.
Raptor
1
runuser ada di versi terbaru Ubuntu. Ada juga alternatif untuk runuser seperti yang dibahas dalam jawaban ini unix.stackexchange.com/questions/169441/ubuntu-runuser-command , misalnya su, dan sudo.
Russell E Glaue
8

Saran Mike terdengar seperti "jalan yang benar". Saya menemukan utas ini ingin menentukan pengguna untuk menjalankan di vncserverbawah pada reboot dan ingin menjaga semua pekerjaan cron saya di satu tempat.

Saya mendapatkan kesalahan berikut untuk cron VNC:

vncserver: The USER environment variable is not set. E.g.:

Dalam kasus saya, saya dapat menggunakan sudountuk menentukan siapa yang menjalankan tugas sebagai.

@reboot sudo -u [someone] vncserver ...
Oliver Moran
sumber
1
Saya mendapat pesan ini di log:sudo: sorry, you must have a tty to run sudo
Renato Gama
@renatoargh Anda mungkin menjalankan di RedHat. Lihatlah jawaban ini di Unix.SE.
kaiser