Komut dosyası etkileşimli olmayan bir kabukta çalıştırılsın mı?


17

Bir senaryo çalıştıran bir cron işim var. Ben bir interaktif kabuk (ssh'ed bash) üzerinden komut dosyası çalıştırdığımda iyi çalışıyor. Betik cron üzerinden kendi kendine çalıştığında başarısız olur.

Benim tahminim, etkileşimli kabukta ayarlanan bazı çevresel değişkenleri kullanıyor olması. Komut dosyasını gidereceğim ve bunları kaldıracağım.

Değişiklik yaptıktan sonra, normalde olduğu gibi çalışmasını sağlamak için betiği cron'da sıraya koyabileceğimi biliyorum, ancak betiği komut satırından çalıştırabileceğim bir yol var, ama cron'dan çalışmasını söylüyorum - etkileşimli olmayan bir ortamda mı?


İlgili ve bu nedenle muhtemelen yararlı: "Bir ksh kabuğunda temiz bir ortam nasıl elde edilir?" bkz. özellikle @Gilles cevabı unset.
sr_

1
@ Sr_ bağlantısından baktım envve denemek isteyebilirsiniz env -i ./my-script.sh. Ayrıca, bir hata mesajı alıyor musunuz?
Kevin

Hangi cron uygulamasını kullanıyorsunuz?
rozcietrzewiacz

@kevin - Eğer cevap verirsen onu oylayacağım.
cwd

Yanıtlar:


12

Cron'dan bir komut çalıştırma ile komut satırında çalıştırma arasındaki temel farklar şunlardır:

  • cron muhtemelen farklı bir kabuk kullanıyor (genellikle /bin/sh);
  • cron kesinlikle küçük bir ortamda (ki bunlar cron uygulamasına bağlıdır, bu yüzden cron(8)veya crontab(5)man sayfasını kontrol edin ; genellikle sadece HOME, belki SHELL, belki LOGNAMEde USERve küçük bir şey vardır PATH);
  • cron %karakteri özel olarak ele alır (yeni satıra dönüştürülür);
  • cron işleri terminal veya grafik ortamı olmadan çalışır.

Aşağıdaki çağırma, kabuk snippet'ini sanki crondan çağrılmış gibi çalıştırır. Snippet'in karakterleri içermediğini varsayıyorum 'veya %.

env - HOME="$HOME" USER="$USER" PATH=/usr/bin:/bin /bin/sh -c 'shell snippet' </dev/null >job.log 2>&1

Ayrıca , sorununuzu çözmenize yardımcı olabilecek , cron'dan bir sh betiği çalıştırma konusuna bakın .


Merhaba @Giles - sadece bir şey düşündüm - gibi bir komut dosyası sudo -u user /path/to/scriptçalıştırmak da herhangi bir değişken seti olmadan çalıştırmak için bir yol olurdu ?
cwd

@cwd Hayır, genellikle değil. sudobazı değişkenleri siler ve diğerlerini bilinen bir değere ayarlar, ancak bu nasıl yapılandırıldığına bağlıdır. Genellikle yerel ayarları korumak için yapılandırılır ve TERMörneğin.
Gilles 'SO- kötü olmayı kes

2

@ Sr_'nin bağlantısından ( ksh kabuğunda temiz bir ortam nasıl elde edilir? ), Env'ye baktım ve bunu denemek isteyebilirsiniz:

env -i ./my-script.sh

@Gilles yanıtı da gerçekten iyi olsa da bu benim için iyi çalıştı.
cwd

@cwd: Benim için çalışmıyor: echo -e '#!/bin/bash -i\necho interactive $-' > ~/test.sh && chmod +x ~/test.sh && env -i ~/test.shçıktılar interactive himB.
Alix Axel

1

Komut dosyalarınızı cron'a koyarken ve başka bir yerde kullanırken ve içinde kullanılan tüm linux komutları için mutlak yollar kullanmanızı öneririm, değişken olarak daha iyi tanımlayın ve kullanın!


Evet. ama tabii.
cwd

0

Cron mutlaka kullandığınız kabuğu kullanmaz. Kontrol:

cat /etc/crontab |grep SHELL

Kabuğunu belirlemek ve komut dosyanızın orada yürütülmesini denemek için - işe yarıyor mu? Bu, birçok kişinin cron'a komut dosyası ekleyen sorunların yaygın bir nedenidir.

Bu sorun varsa - bu betiğin bash'de çalıştırılmasını sağlamak için betiğinizin başına "bash" ekleyebilirsiniz. Bu sorunu çözmezse, bana bildirin, biraz daha derine ineceğim.


0

Bazı komut dosyaları tarafından sağlanan bazı etkileşimli soruları yok saymak isterseniz, şunları deneyebilirsiniz:

yes | your_command

Ya yes "n"da Hayır, tüm soruları istiyorum.

Komut:

evet - tekrarlayıcı ol, evet, eksiksiz veya varsayılan olarak 'y' sonsuza dek çıktılar.


0

Komut dosyanızı etkileşimli olmayan bir kabukta (ayrıntılarıyla ilgili olmayan) çalıştırmak için cronbunu yoluyla yapabilirsiniz ssh.

Gerçekten etkileşimli olmayan bir kabukta olup olmadığınızı test edin:

> ssh someuser@somehost tty
not a tty

Komut dosyasını etkileşimli olmayan bir kabukta yürütün:

> ssh someuser@somehost /tmp/myscript.sh
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.