Jalankan skrip dalam shell non-interaktif?


17

Saya memiliki pekerjaan cron yang menjalankan skrip. Ketika saya menjalankan skrip melalui shell interaktif (ssh'ed to bash) berfungsi dengan baik. Ketika skrip berjalan dengan sendirinya melalui cron, ia gagal.

Dugaan saya adalah bahwa ia menggunakan beberapa variabel lingkungan yang ditetapkan dalam shell interaktif. Saya akan memecahkan masalah skrip dan menghapus ini.

Setelah saya membuat perubahan, saya tahu saya bisa mengantri script di cron untuk menjalankannya seperti biasanya, tetapi apakah ada cara saya bisa menjalankan script dari baris perintah, tetapi katakan untuk menjalankannya seperti dari cron - yaitu dalam lingkungan non-interaktif?


Terkait dan dengan demikian mungkin membantu: "Bagaimana cara mendapatkan lingkungan yang bersih di shell ksh?" lihat terutama jawaban @Gilles mengenai unset.
sr_

1
Dari tautan @ sr_, saya melihat ke atas env, dan Anda mungkin ingin mencoba env -i ./my-script.sh. Juga, apakah Anda menerima pesan kesalahan?
Kevin

Implementasi cron apa yang Anda gunakan?
rozcietrzewiacz

@kevin - saya akan menjawabnya jika Anda menjawabnya.
cwd

Jawaban:


12

Perbedaan utama antara menjalankan perintah dari cron dan menjalankan di baris perintah adalah:

  • cron mungkin menggunakan shell yang berbeda (umumnya /bin/sh);
  • cron pasti berjalan dalam lingkungan kecil (mana yang tergantung pada pelaksanaan cron, jadi memeriksa cron(8)atau crontab(5)halaman manual; umumnya hanya ada HOME, mungkin SHELL, mungkin LOGNAME, mungkin USER, dan kecil PATH);
  • cron memperlakukan %karakter secara khusus (diubah menjadi baris baru);
  • pekerjaan cron berjalan tanpa lingkungan terminal atau grafis.

Doa berikut akan menjalankan potongan shell seperti jika dipanggil dari cron. Saya menganggap cuplikan tidak berisi karakter 'atau %.

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

Lihat juga mengeksekusi skrip sh dari cron , yang dapat membantu menyelesaikan masalah Anda.


Hai @ Giles - hanya memikirkan sesuatu - akan menjalankan skrip seperti sudo -u user /path/to/scriptjuga menjadi cara untuk menjalankannya tanpa variabel ditetapkan?
cwd

@ cwd Tidak, biasanya tidak. sudomenghapus beberapa variabel dan menetapkan yang lain ke nilai yang diketahui, tetapi itu tergantung pada bagaimana hal itu dikonfigurasi. Ini sering dikonfigurasi untuk mempertahankan pengaturan lokal dan TERM, misalnya.
Gilles 'SO- stop being evil'

2

Dari tautan @ sr_ ( Bagaimana mendapatkan lingkungan yang bersih di shell ksh? ), Saya melihat ke atas, dan Anda mungkin ingin mencoba ini:

env -i ./my-script.sh

Ini bekerja dengan baik untuk saya walaupun jawaban @Gilles juga sangat bagus.
cwd

@ cwd: Tidak berfungsi untuk saya: echo -e '#!/bin/bash -i\necho interactive $-' > ~/test.sh && chmod +x ~/test.sh && env -i ~/test.shkeluaran interactive himB.
Alix Axel

1

Saya sarankan Anda menggunakan path absolut untuk skrip Anda ketika meletakkannya di cron dan menggunakan di tempat lain dan untuk setiap dan semua perintah linux yang digunakan di dalamnya, lebih baik menyatakannya sebagai variabel dan menggunakannya!


Iya. tapi tentu saja.
cwd

0

Cron tidak harus menggunakan shell yang sama yang Anda gunakan. memeriksa:

cat /etc/crontab |grep SHELL

Untuk menentukan shell dan mencoba eksekusi skrip Anda di sana - apakah itu berfungsi? Ini adalah penyebab umum masalah bagi banyak orang menambahkan skrip ke cron.

Jika ini masalahnya - Anda dapat menambahkan "bash" ke awal skrip Anda di cron untuk memaksa skrip ini dieksekusi di bash. Jika ini tidak menyelesaikan masalah, beri tahu saya dan saya akan menggali sedikit lebih dalam.


0

Jika Anda ingin mengabaikan beberapa pertanyaan interaktif yang disediakan oleh beberapa skrip, Anda dapat mencoba:

yes | your_command

Atau yes "n"jika Anda ingin Tidak semua pertanyaan.

Perintah:

ya - menjadi ya afirmatif berulang output sumpah serapah, atau, secara default, 'y', selamanya.


0

Untuk menjalankan skrip Anda dalam cangkang non-interaktif (tidak membahas detail cron), Anda dapat melakukannya melalui ssh.

Uji apakah Anda benar-benar berakhir di cangkang non-interaktif:

> ssh someuser@somehost tty
not a tty

Jalankan skrip dalam shell non-interaktif:

> ssh someuser@somehost /tmp/myscript.sh
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.