crontab yürütme yürütme kullanıcısıyla aynı ortam değişkenlerine sahip değil


20

Crontab işimi 0 2 */1 * * /aScript >aLog.log 2>&1bir 'root' kullanıcısı olarak çalıştırdım, ancak env'in 'root' kullanıcısının env'sinden farklı olduğunu ve bu nedenle scriptlerimin farklı bir çalışma zamanı davranışını yaşadığımı gördüm.

Deneme düzeltmesi, rc.d dosyalarına dışa aktarma komutları yerleştirmekti, ancak yine de görünmedi! Sonunda aScript'in içine ihracat komutları yerleştiriyorum .

Sorum şu: Bu soruna yaklaşmanın daha iyi bir yolu var mı? ve env aynı kullanıcının 'root'undan olmasına rağmen neden eksik? (Kökten 'crontab -e' çalıştırarak crontab'ı değiştiriyorum)


8
Cron her zaman çoğunlukla boş bir ortamla çalışır. HOME, LOGNAME ve SHELL ayarlanmıştır; ve çok sınırlı bir PATH. Tüm değişkenleri kendiniz ayarlamak istemiyorsanız source, (bash) profilinize erişebilirsiniz.
cyberx86

2
@ cyberx86: Bunu neden bir cevap olarak yazıp destek almıyorsunuz?
user9517 GoFundMonica

2
@Iain: rep her zaman açığız - ama bazen tek satırlık cevap gerçekten temsilcisi kazanmıyor gibi geliyor. Tamamen özlü bir cevabın yeri olduğunu kabul ediyorum, ancak bazı yardımlar sağlamak istediğimde (belki de 01:00 idi) açıklamaları 'kolay bir yol' olarak kullanıyorum (belki de yanlış). ..). Bununla birlikte, tavsiyenizi alacağım ve bunu biraz genişleteceğim ve bir cevap olarak ekleyeceğim.
cyberx86

@ cyberx86: Doğru bir astarı yanlış ya da hiç yoktan daha iyidir.
user9517 GoFundMonica

Yanıtlar:


31

Cron her zaman çoğunlukla boş bir ortamla çalışır. HOME, LOGNAME ve SHELL ayarlanmıştır; ve çok sınırlı bir PATH. Bu nedenle, çalıştırılabilir dosyalar için tam yolların kullanılması ve cron kullanırken betiğinizde gereken değişkenlerin dışa aktarılması önerilir.

Ortam değişkenlerinizi cron olarak ayarlamak için kullanabileceğiniz çeşitli yaklaşımlar vardır, ancak bunların hepsi komut dosyanızda ayarlamanız anlamına gelir.

Yaklaşım 1:

İhtiyacınız olan her değişkeni komut dosyanızda manuel olarak ayarlayın.

Yaklaşım 2:

Profilinizi kaynaklayın:

. $HOME/.bash_profile(veya . $HOME/.profile)

(Genellikle yukarıdaki dosyanın başka dosyalara kaynak sağlayacağını görürsünüz (örn. ~ / .Bashrc -> / etc / bashrc -> /etc/profile.d/*) - değilse, bunları da kaynaklayabilirsiniz.)

Yaklaşım 3:

Ortam değişkenlerinizi bir dosyaya kaydedin (istediğiniz kullanıcı olarak çalıştırın):

env > /path/to/my_env.sh

Ardından cron betiğinizle içe aktarın:

env - `cat /path/to/my_env.sh` /bin/sh

Yaklaşım 4:

Bazı durumlarda, içinde global cron değişkenleri ayarlayabilirsiniz /etc/default/cron. Bununla birlikte, tüm cron işleri için ayarlanacağı için bunun bir risk unsuru vardır.


Yaklaşım 2, env değişkenlerinde diske vurmaması gereken hassas şeylerin olduğu sunucular için en iyisidir - şifreler, api anahtarları, vb.
ap

Yaklaşım 4, docker motor setlerinin env değişken olduğu docker ortamında benim için çalıştı. Ancak bunun çalışması için doveri giriş noktasına env'imi kaydetmek zorunda kaldım. Komple çözüm burada: github.com/rayyanqcri/swarm-scheduler
hammady

3. yaklaşımımı benim için açıklar mısınız? İçe bash: SHELL=/bin/bash: No such file
aktarmaya

1

Cron, OWN kabuğunu çalışacağı belirtilen kullanımla oluşturur.

Bu nedenle, kullanıcınızın aynı değişkenini korumak istiyorsanız, kök veya başka bir kullanıcı yerine kendi kullanıcınızla çalıştırmayı deneyin.

Veya

En iyi yol, bu değişkenleri kendi komut dosyanızda dışa aktarmanızdır.


1

RedHat CentOS'ta, /etc/rc.d/init.d/functions varsayılan PATH değerini kalıcı olarak ayarlayabilirsiniz. /etc/rc.d/crond başlatıldığında işlevleri çağırır.


0

AWS'mde de benzer bir sorun vardı. Böyle anladım

which python3

bana /usr/bin/local/python3yer verdi

ve sonra

. $HOME/.profile; /usr/local/bin/python3 /home/ubuntu/your_script.py
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.