cron “.bashrc” ve “.bash_profile” içinde tanımlanan değişkenleri yoksayar.


49

/ Etc / crontab dosyasında "SHELL" değişkenini tanımladım:

[martin@martin ~]$ grep SHELL /etc/crontab 
SHELL=/usr/local/bin/bash
[martin@martin ~]$ file /usr/local/bin/bash
/usr/local/bin/bash: ELF 32-bit LSB executable, Intel 80386, version 1 (FreeBSD), dynamically linked (uses shared libs), for FreeBSD 8.0 (800107), stripped
[martin@martin ~]$ 

Ayrıca, / etc / crontab dosyasındaki tüm komut dosyalarım "martin" kullanıcısı altında başlatıldı. Ancak /home/martin/.bash_profile (giriş kabuğu için) ve /home/martin/.bashrc (günlük olmayan kabuk için), cron işi durumunda göz ardı edilen bazı değişkenler içerir, ancak makineye giriş yaptığımda kullanılır SSH veya yeni bash oturumu açın. Cron bu değişkenleri neden görmezden geliyor? Cron, "/ usr / local / bin / bash my-script.sh" komutunu "martin" kullanıcısı için kullanmakla basitçe çalıştırmıyor mu?


2
Ubuntu kullanıcıları, Ubuntu'nun varsayılanının etkileşimli olmayan mermilerde çalışmasını engelleyen bir çizgiye.bashrc sahip olduğunu belirtmek isteyebilirler .
joeytwiddle

Yanıtlar:


72

İstediğiniz dosyayı, işi yürüten kullanıcının komut dosyasının en üstünde veya iş başında kaynak yapabilirsiniz. "Kaynak" komutu bir yerleşiktir. Değişiklikleri yüklemek için bu dosyalarda düzenlemeler yaparsanız aynı şeyi yaparsınız.

* * * * * source /home/user/.bash_profile; <command>

veya

#!/bin/bash
source /home/user/.bash_profile

<commands>

2
Cron bashkabuğu kullanmıyorsa "kaynak" çalışmayabilir unutmayın . Kabuk olduğunda davayı kaldırabilecek bir cevap ekledim sh.
Jonathan,


23

Çünkü etkileşimli bir kabuk değil. Bazı terminalleri açtığınızda da aynı şey olur.

Bu soruya bir göz atın: .bashrc dosyasi nedir? | Süper kullanıcı

Ve ayrıca bu konuda:

.Bashrc, .bash_profile ve .environment arasındaki fark nedir? | Yığın Taşması

Bağlantının bir oturum açma kabuğu (veya değil), etkileşimli bir kabuk (veya olmamasına) veya her ikisine de bağlı olarak farklı komut dosyaları açılır.

Bashrc yapmak istiyorsanız bu değişikliği yapmanız gerekir:

Bash etkileşimli olmayan bir şekilde başlatıldığında, bir kabuk betiğini çalıştırmak için, örneğin, ortamdaki BASH_ENV değişkenini arar, orada görünürse değerini genişletir ve genişletilmiş değeri okumak ve yürütmek için bir dosyanın adı olarak kullanır . Bash, aşağıdaki komut yürütülmüş gibi davranır:

if [ -n "$BASH_ENV" ]; then . "$BASH_ENV"; fi 

ancak PATH değişkeninin değeri, dosya adını aramak için kullanılmaz.

Yukarıda belirtildiği gibi, eğer etkileşimli olmayan bir kabuk --loginseçeneği ile çağrılırsa , Bash giriş kabuğu başlangıç ​​dosyalarından komutları okumaya ve yürütmeye çalışır.

Kaynak: Bash Başlangıç ​​Dosyaları | Bash Referans Kılavuzu | gnu.org


Bu yüzden, eğer CASH'ın içine BASH_ENV koyarsak, cron bash betiği cron etkileşimli ve giriş yapmadığından kaynaklayacaktır.
CMCDragonkai

12

Sen çalıştırmak mümkün olmayabilir sourceeğer shkabuk kullanılıyor. Bu, crontab'ınıza aşağıdaki satırı ekleyerek değiştirilebilir:

SHELL=/bin/bash
* * * * * source "/root/.bashrc"; <command>

Ayrıca ortamı belirleyebilirsiniz:

BASH_ENV="/root/.bashrc"
* * * * * <command>

veya /home/user/.bashrcbir kullanıcı cron işi ise yerelinizi kullanabilirsiniz (örn. crontab -e).

Varsa .bash_profiledeğiştirilebileceğini unutmayın .bashrc.

Kredi: cron kabuğu nasıl değiştirilir (shh bash)?


Bu, temelde cron işleri olan Acquia Cloud Scheduled işleri için de iyi çalışır. Gibi, aynı şeyi yapabilirsiniz:SHELL=/bin/bash && source /home/YOUR_USER_NAME/.bash_profile && sh ....
Alejandro Moreno

1

Bir .bashrccronjob'dan kaynaklanmasını engelleyebilecek başka bir şey de bu dosyanın etkileşimli mermileri tespit etmek için yaptığı kontrollerdir.

Örneğin, Ubuntu 18.04'te, .bashrcbir kullanıcı için varsayılanlar bununla başlar:

# ~/.bashrc: executed by bash(1) for non-login shells.
# see /usr/share/doc/bash/examples/startup-files (in the package bash-doc)
# for examples

# If not running interactively, don't do anything
case $- in
    *i*) ;;
      *) return;;
esac

ve böylece kaynak derhal çıkacağı için faydalı bir şey yapmaz.


1

Bu -lseçenekle bash'i çağırabilirsin :

* * * * * /bin/bash -l /path/to/script arg1 arg2

-lSeçenek bash yapar giriş kabuğu. Böylece, kullanıcının okuyacak .bash_profile. .bashrcAçıkça kaynaklanmadıkça , kullanıcının okumasını yapmaz .bash_profile. Bunun nedeni etkileşimli olmayan kabukların otomatik olarak okumamasıdır .bashrc. Ancak .bashrcbir cron işine ihtiyaç duymamanız gerekir çünkü etkileşimli bir kabuk .bashrciçin yararlı olan şeyler ayarlamak içindir .

Varyasyonlar:

Bash PATH üzerindeyse, mutlak bir yol belirtmeye gerek yoktur:

* * * * * bash -l /path/to/script arg1 arg2

Bir optimizasyon kullanarak şu anki kabuğu değiştirmek gerekir exec:

* * * * * exec bash -l /path/to/script arg1 arg2

1

bashBir kabuk veya normal bir programlama dili olup olmadığı gibi farklı davranır (gibi perlveya python).

Tasarım gereği, ayarlar ~/.bash_profile, ~/.bashrcne zaman, vb set şeylere kullanıcılar içindir bashoynayan bir kabuk rolünü (giriş kabuğu interractive kabuk). Sahip olduğunuz ortamı xterm(etkileşimli kabuk) veya sshoturumlarda (giriş kabuğu) veya konsollarda (giriş kabuğu) düşünün .

Öte yandan, bashaynı zamanda güçlü bir progamming dilisystemd - farklı bir çalışma tarzı gerektiren hizmetleri yönetmek için birçok senaryo hakkında düşünün . Örneğin, bir geliştirici bir sistem komut dosyası veya bashprogram yazarken , kullanıcıyı ~/.bash_profileotomatik olarak kaynaklamak istemeyecektir . Bu normal bir programdır, kabuk değil. Normal bir program ( bashprogramlar dahil ) doğal olarak mevcut çalışma ortamından (kabuk) ayarları devralır , fakat bunları ayarlamaz .

Biz bir program yazarsanız croniçinde bash-o sadece yazılacak olur bash; aslında, biz bunu yazabilir pythonveya perlveya başka bir Progamming o zaman kaynaklar için bir seçenek olabilir DİLİ- bash'ın ~/.bash_profile(okuyun: sadece programlama dilinin aynı dil olur kullanıcının kabuğunun ayarı):

[ -f /home/user/.bash_profile ] && . /home/user/.bash_profile

Bununla birlikte, söz konusu kullanıcı bashkabuğu olarak kullanılmazsa ne olur ? O / o kullanabilir zsh, ksh, fishgenel kullanım için programı yazarken, vb Yani, bu uygulama gerçekten işe yaramaz.

Yani, ~/.bash_profilebunun işe yarayacağını düşünüyorsanız kaynak oluşturabilirsiniz. Ancak, burada bir dosyaya kaynak verip kaynaklayamayacağımızla ilgili değil, sistemde işlerin nasıl çalışması gerektiğiyle ilgili değil: tasarım konsepti . Kısacası: Biz görmek gerekir bashkabuğu ve dili progamming: birşey 2 rolü olup . O zaman her şey anlamak daha kolay olacak.


0

NVM kullanan cron'dan bir düğüm uygulamasını çalıştırırken de aynı sorunu yaşadım, bash kabuğunu cron'dan .bashrc dosyasını okumak için bash komutunu interaktif kabuk seçeneği `-l ile başlattım.

Örneğin: * * * * * /bin/bash -lc '/home/user/myapp.sh restart'

Bu işe yaramazsa, crontab'da path path değişkenini ayarlamayı deneyin.

41 7 * * * /bin/bash -lc "PATH=$PATH:/home/user/.nvm/versions/node/v8.10.0/bin && /home/user/script.sh restart "

-1

Bununla başa çıkma yolum şuydu:

1) Değişkenlerimi (sonuna) yerleştirmek ~/.profile:

myVarInDotProfile="someValue"

2)~/cronDaily.sh Komutlarımı içeren (günlük) cron görevlerim için ( ve tekrarlayan kaynaklardan oluşan ) bir Bash betiği oluşturmak ~/.profle:

source ~/.profile
command ${myVarInDotProfile}/

3) betiğimin yürütülmesini crontabgünlük olarak çalıştırmak üzere zamanlama :

0 0 * * * bash ~/cronDaily.sh

Değişkenim göz ardı edilmedi ve komutlar başarıyla yürütüldü.


Bazıları böyle yoğun bir kaynağın ~/.profilesorunlu olduğunu söyleyebilir . Özel durumumda bunun neden bir sorun olduğunu anlamıyorum, ancak bunun için özel bir dosya oluşturmayı düşünmenizi tavsiye ederim.

Genel olarak, bunun daha iyi bir yolu olabilir, ancak bu benim için çok fazla acı çektikten sonra işe yarayan şeydi ve Bash 4.3.46'dan itibaren bir dosyayı kaynaklayamayacağınız ilkesini açıklıyor crontab.

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.