Cron bir işi yürütürken 'çalışma dizini' nedir?


170

Komut satırından çalıştırdığımda çalışan bir komut dosyasını kullanıyorum, ancak programladığımda crondosyaları veya komutları bulamadığı için hatalar alıyorum. Sorum iki katlıdır:

  1. Kullanarak bir cron işi zamanlarken crontab -e, kullanıcı kimliğimi izinlerinin temeli olarak kullanır mı? Yoksa bir tür cron kullanıcı kimliği ve ilgili izinleri kullanıyor mu?

  2. Bir cron işi başlatıldığında, çalışma dizini nedir? Çalıştırılacak betiği belirttiğim dizin mi, yoksa farklı bir dizin mi?

İşte benim cron işim:

15 7 * * * /home/xxxx/Documents/Scripts/email_ip_script.sh

İşte asıl komut dosyası:

vIP_ADDR="`curl automation.whatismyip.com/n09230945.asp`"
echo "$vIP_ADDR"
sed "s/IPADDR/$vIP_ADDR/g" template.txt > emailmsg.txt
ssmtp XXXXX@gmail.com < emailmsg.txt

İşte mailtarafından üretilen mesajı görüntülediğimde aldığım hatalar cron:

sed: can't read template.txt: No such file or directory
/home/xxxx/Documents/Scripts/email_ip_script.sh: line 15: ssmtp: command not found

template.txtBulamaz , ancak komut dosyasıyla aynı dizinde bulunur. Ayrıca çalıştırılamıyor ssmtp, ancak kullanıcım olarak çalışabiliyorum. Bunun düzgün çalışması için neyi özlüyorum?

Yanıtlar:


158

Ekle cd /home/xxxx/Documents/Scripts/İşinin bu dizinde çalıştırmak istiyorsanız. Cron'un belirli bir dizine geçmesi için hiçbir neden yok. Cron komutlarınızı giriş dizininizde çalıştırır.

Gelince ssmtp, varsayılan olarak olmayabilir PATH. Cron varsayılan yolu uygulaması bağımlı olduğunu, bu nedenle erkek sayfasını kontrol, ancak olasılıkla ssmtpolduğu /usr/sbinvarsayılan içinde olmadığı PATH, yalnızca kök en.

PATH=/usr/local/bin:/usr/bin:/bin:/usr/local/sbin:/usr/sbin:/sbin
15 7 * * * cd /home/xxxx/Documents/Scripts && ./email_ip_script.sh

@Giles - Teşekkürler, cronkendine ait olur mu PATHyoksa kullanıcımı kontrol edebilir miyim PATH? Ssmtp'yi , birinin kullanmasına izin vereceğini düşünerek (cron dahil), kendi userve wheelizin için hazırladım . CENTOS 6.2 üzerinde Im yardımcı olursa
ProfessionalAmateur

3
@ProfessionalAmateur Senin sorunun, senin kullanımına izin verilmiyor ssmtpdeğil, senin cron işinin, senin içinde olmadığı için, denilen herhangi bir yürütülebilir dosya bulamaması ssmtpdeğil PATH. “Kullanıcınız” diye bir şey yoktur PATH; bu, işlem başına ayardır, kullanıcı başına ayar değildir. Tüm cron işlerinizin yolunu PATH=…crontab'ınıza bir çizgi koyarak ayarlayabilirsiniz .
Gilles

MAILTO='XXXX@gmail.com 'i de ekleyerek PATH kurulumuyla çalışmam gerekti. Wierd ama benim için çalıştı.
mac

Ssmtp için bir kullanabilirsiniz; ´which ssmtp´ ...
Fredrick Gauss

@ FredrickGauss Şunu yapıntype ssmtp
Gilles

20

Eğer cronjob bir bash betiği ise, aşağıdakiler betiğinizin yerine CD olacaktır (cron tanımınızda mutlak yol kullandığınızı varsayarak):

cd "$(dirname "$0")";

14

1. soruyu cevaplamak için: crontab -ekendi kullanıcınız olarak çalışıyorsanız, işler o kullanıcının crontab'ında programlanmış ve bu nedenle bu kullanıcının izinleriyle çalışacaktır.

Ancak, işlerin etkileşimli olmayan bir kabukta çalışacağını, $ PATH'in komut dosyasını komut satırından çalıştırırken sahip olduğunuzdan farklı olabileceğini düşünmeniz gerekir.

Komut dosyalarında her zaman tam yolları kullanmak en iyisidir, özellikle / cron.

Gördüğünüz sorunları tam olarak önlemek için tüm dosyalara tam yol kullanmanızı tavsiye ederim.

Yarış koşullarını ve diğer güvenlik sorunlarını önlemek mktempiçin, okuduğunuz dosyanın betiğinizin dışındaki hiçbir şey tarafından değiştirilmediğinden emin olmak için kullanmanız gerekir .

Bu yüzden senaryoyu şöyle bir şeyle değiştiririm:

vIP_ADDR="`curl automation.whatismyip.com/n09230945.asp`"
echo "$vIP_ADDR"
mail_msg=`/bin/mktemp`
/bin/sed "s/IPADDR/$vIP_ADDR/g" /home/xxxx/Documents/Scripts/template.txt > $mailmsg
/path/to/ssmtp XXXXX@gmail.com < $mailmsg
/bin/rm $mailmsg

7

cronHer kullanıcının zamanlanmış işlerini bu kullanıcı olarak çalıştırır. Bu, komut dosyalarınızı giriş dizininize göre çalıştırdığını bulmamız için yeterli olmalıdır.

Farklı bir konumdan çalıştırmanız gerekirse cd, o konuma gitmek için komut dosyanızı kullanın.

ssmtpmuhtemelen cronvarsayılan PATH içinde değildir (çoğu platformda tasarım ile çok dar olarak ayarlanmıştır). ssmtpKomut dosyanızın tam yolunu belirtebilir veya PATH'i a) tüm komut dosyalarınız için kullanılabilecek crontab dosyanızda veya b) her komut dosyasında açıkça belirleyebilirsiniz.


3

Kontrol bu kolayca cron ortamını öğrenmek için aşağıdaki adımlar iplik, etkileşimli kabukta için kullanılan çok daha azdır. En iyisi hiçbir şeyin ayarlanmadığını ve açıkça kendin ayarlayacağını varsaymak.


1

İşin cronyürütülmesi için varsayılan çalışma dizini, genellikle giriş dizinidir /home/your-user-name.

@Kusalananda mükemmel yorum benimseyerek.


1
Hayır. Sistemin ev dizinlerini nerede tuttuğuna bağlıdır. /homeevrensel olmaktan uzak.
Kusalananda

1
@Kusalananda LSB standardı diyor /home.
Peter

1
@ Pekala, macOS kullanır /Usersve tarihsel Unices kullanır ve /usrhatta Linux'ta, bir sistem kullanıcısının ana dizini altında /varya da başka bir yerde olabilir.
Kusalananda

1
@Kusalananda Bu doğru.
Peter

Teşekkürler, bu soruyu gerçekten cevaplayan tek
kişisin

0

Bazı insanlar bunun üzerine ima etti veya bağladılar ama bu konuyu benim görüşmem için doktora bulamadığım için öğrenmenin en iyi yolu bunu bir cron'a eklemek.

* * * * * echo $PATH > /tmp/lolcronjobs

Benim durumumda ubuntu varsayılan olarak yalnızca /usr/bin:/binbirkaç soruna neden olanı kullanır .

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.