Jak ustawić PATH crona globalnie (tj. Dla wszystkich użytkowników) na stałe?

10

Musimy mieć / usr / local / bin na ścieżce crona dla wszystkich użytkowników. Czy istnieje sposób na ustawienie go w systemie, bez konieczności edytowania pliku crontab każdego użytkownika?

Próbowaliśmy dodać PATH do / etc / crontab:

# grep PATH /etc/crontab
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

Ale kiedy użytkownicy mają to w swoim crontab:

$ crontab -l | grep PATH
* * * * * echo $PATH > /tmp/current_cron_path

... ujawnia, że ​​ich ścieżka jest wciąż ustawiona na domyślną:

$ cat /tmp/current_cron_path
/usr/bin:/bin
grosser
źródło
2
Ogólna wskazówka: napisanie „nie działało” zazwyczaj nie przyniesie ci użytecznej odpowiedzi. Zawsze opisuj, jak dokładnie to nie działało, to znaczy dokładnie, co zrobiłeś i jaki dokładnie był wynik.
sleske
Pamiętaj, że poleganie na echocronie jest prawdopodobnie zawodne .
Der Hochstapler

Odpowiedzi:

4

Możesz skonfigurować PATH w pliku konfiguracyjnym crontab, jak pokazano w pierwszym kodzie, chyba że tam . Najpierw określ zmienne env, a następnie zadania.

UPD: Ponieważ link jest zepsuty, oto fragment:

SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/

# run-parts
01 * * * * root run-parts /etc/cron.hourly
02 4 * * * root run-parts /etc/cron.daily
22 4 * * 0 root run-parts /etc/cron.weekly
42 4 1 * * root run-parts /etc/cron.monthly
igorp1024
źródło
1
nie działa na Ubuntu, nawet po ponownym uruchomieniu crona
grosser
1
@grosser: Cóż, powinno. Prześlij swój kompletny plik crontab (edytuj swoją odpowiedź), wraz z danymi wyjściowymi, które produkuje, i dlaczego uważasz, że to nie działa. Potem zobaczymy ...
śleske,
Należy również pamiętać, że format wierszy wartości ZMIENNA = jest nieco bardziej ograniczony niż w skrypcie powłoki: Każde przypisanie musi znajdować się w osobnym wierszu i nie można używać zmiennych po prawej stronie (np. ŚCIEŻKA = $ ŚCIEŻKA: / bla nie będzie działać).
sleske
I uaktualniony pytanie, ustawienie PATH w indywidualnej crontab nie praca, tylko globalna zmiana nie działa
grosser
Spróbuj podać zmienne PATH w każdym crontab, gdzie jest to potrzebne. Prawdopodobnie dzieje się tak z powodu problemów z bezpieczeństwem. BTW, w ubuntu (sprawdziłem) ŚCIEŻKA jest zdefiniowana w / etc / crontab i /etc/cron.d/anacron w ubuntu. Wygląda więc na to, że nie jest dziedziczony z / etc / crontab. Spróbuj zdefiniować to w sudo crontab -e
rootie
3

Ustawienie zmiennej PATH powinno działać w Ubuntu, jak możesz powiedzieć, że nie działa?

Patrz nr 14: Linux Crontab: 15 świetnych przykładów zadań Crona

maniak
źródło
zaktualizowałem pytanie, ustawienie PATH w pojedynczym crontabie zadziałało, po prostu globalna zmiana nie zadziałała
grosser
1

Nie mogłem też znaleźć rozwiązania tego problemu. Najbliższe mi godne rozwiązanie jest następujące (pochodzi z https://raymii.org/s/tutorials/Better_cron_env_and_shell_control_with_the_SHELL_variale.html ).

  • Zmień powłokę dla swojego zadania cron i skieruj ją na skrypt bash. Tj. U góry kumpla dodaj: SHELL=/path/to/setup/cron.bash
  • W tym skrypcie powłoki ładuj zmienne środowiskowe i określ inne zmienne. Pamiętaj o dołączeniu następujących 4 wierszy u góry. Resetuje zmienną SHELL na bash i wykonuje powłokę bash, aby uruchomić cronjobs.

Na przykład:

#!/bin/bash
set -e

source /etc/environment
source /etc/profile
# restore SHELL env var for cron
SHELL=/bin/bash

# execute the cron command in an actual shell
exec /bin/bash --norc "$@"

Wada: wymaga to określenia SHELL=...na górze każdego kumpla. Zaleta: będziesz używać zwykłych zmiennych środowiskowych i nie będziesz musiał się martwić o utrzymanie spójności między zmiennymi cron i innymi

Laurens Rietveld
źródło
0

Jeśli możesz być rootem, czy możesz spróbować edytować /etc/init.d/croni zmienić ŚCIEŻKĘ w tym miejscu? Nie testowałem tego, ale warto sprawdzić.

Rich Homolka
źródło
nie działało, właśnie dodałem PATH = xxx do /etc/init.d/cron, ale wyjście * * * * * echo $ PATH było takie samo
grosser