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

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.


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

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.


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


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 ...

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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.