Jak określić w crontab, przez którego użytkownika uruchomić skrypt? [Zamknięte]

176

Mam kilka zadań crontab, które działają z uprawnieniami administratora, ale stwarza to pewne problemy. Na przykład wszystkie foldery utworzone w trakcie tego zadania cron znajdują się w katalogu głównym użytkownika i katalogu głównego grupy. Jak mogę sprawić, by działał z danymi www użytkownika i grupowymi danymi www, więc kiedy uruchamiam skrypty z mojej strony internetowej, mogę manipulować tymi folderami i plikami?

Mój serwer działa na Ubuntu.
Obecne zadanie crontab to:

*/1 * * * * php5 /var/www/web/includes/crontab/queue_process.php >> /var/www/web/includes/crontab/queue.log 2>&1
arma
źródło

Odpowiedzi:

335

Zamiast tworzyć tabelę crontab do uruchamiania jako użytkownik root, utwórz tabelę crontab dla użytkownika, któremu chcesz uruchomić skrypt. W twoim przypadku crontab -u www-data -eedytuje crontab dla użytkownika danych www. Po prostu umieść tam swoje pełne polecenie i usuń je z tabeli crontab użytkownika root.

Mikrofon
źródło
54
Działa to tak samo, gdy używasz crontab -ejako określonego użytkownika.
kułak
7
Ale czy ta tabela crontab zostanie sprawdzona podczas uruchamiania systemu, czy tylko wtedy, gdy użytkownik się zaloguje?
Bruno Finger
11
cronw systemach * nix nie wymaga logowania użytkownika w celu wykonania zadań określonych w crontab konkretnego użytkownika.
Mike
2
Czy spowoduje to również ustawienie identyfikatora grupy zgodnie z zapytaniem PO? Co się stanie, jeśli żądana grupa różni się od podstawowej grupy użytkownika?
askyle
49

EDYCJA: Zauważ, że ta metoda nie będzie działać z crontab -e, ale działa tylko wtedy, gdy edytujesz bezpośrednio / etc / crontab. W przeciwnym razie może pojawić się błąd, taki jak/bin/sh: www-data: command not found

Tuż przed nazwą programu:

*/1 * * * * www-data php5 /var/www/web/includes/crontab/queue_process.php >> /var/www/web/includes/crontab/queue.log 2>&1
Christian Nowak
źródło
To sprawiłoby, że działałby jako użytkownik apache z danymi www, prawda?
arma
19
Zwróć uwagę, że ta metoda nie będzie działać crontab -e, ale działa tylko wtedy, gdy edytujesz /etc/crontabbezpośrednio. Przeczytaj komentarz u góry tego pliku, aby uzyskać więcej informacji.
imgx64,
5
Użytkownika można określić tylko w systemowej tabeli crontab
James Roth
Mam kilka zadań zgodnie z harmonogramem w systemie crontab. Kiedy to robię sudo crontab -e, widzę oferty pracy. Ale otwieram plik, /etc/crontabnie ma pracy. Czy to jest dziwne? sudo crontab -eCzy to zadziała, jeśli dodam ofertę pracy z określonym użytkownikiem?
eNeMetcH
14

Ponieważ używasz Ubuntu, twój systemowy plik crontab znajduje się pod adresem /etc/crontab.

Jako użytkownik root (lub używając sudo) możesz po prostu edytować ten plik i określić użytkownika, który powinien uruchomić to polecenie. Oto format wpisów w systemowej tabeli crontab i sposób wpisywania komendy:

# 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

Oczywiście uprawnienia do skryptu php i pliku dziennika powinny być ustawione tak, aby www-dataużytkownik miał do nich dostęp.

pymkin
źródło
Pomyślałem, że to powinno być równoważne z „ crontab -echociaż”; ale nie.
mruga
5
Dokumentacja Ubuntu odradza edycję pliku / etc / crontab, ponieważ można go zastąpić aktualizacjami. crontab -e utworzy specyficzny dla użytkownika plik cron w / var / spool / cron / crontabs.
Hemm
9

Możesz także spróbować użyć runuser(jako root), aby uruchomić polecenie jako inny użytkownik

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

Zobacz też: man runuser

Russell E. Glaue
źródło
runusernie jest zawarty w Ubuntu.
Raptor
1
runuser jest w najnowszej wersji Ubuntu. Istnieją również alternatywy dla runuser, jak omówiono w tej odpowiedzi unix.stackexchange.com/questions/169441/ubuntu-runuser-command , np. Su i sudo.
Russell E Glaue
8

Sugestia Mike'a brzmi jak „właściwy sposób”. Natknąłem się na ten wątek, chcąc określić użytkownika, który ma działać vncserverpo ponownym uruchomieniu i chciałem zachować wszystkie moje zadania crona w jednym miejscu.

Otrzymałem następujący błąd dla crona VNC:

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

W moim przypadku mogłem użyć sudodo określenia, kto ma uruchomić zadanie.

@reboot sudo -u [someone] vncserver ...
Oliver Moran
źródło
1
W logach dostałem taką wiadomość:sudo: sorry, you must have a tty to run sudo
Renato Gama
@renatoargh Prawdopodobnie korzystasz z RedHata. Spójrz na tę odpowiedź w systemie Unix.SE.
kaiser