Chạy script trong shell không tương tác?


17

Tôi có một công việc định kỳ đang chạy một kịch bản. Khi tôi chạy tập lệnh thông qua trình bao tương tác (ssh'ed to bash), nó hoạt động tốt. Khi tập lệnh tự chạy qua cron thì nó bị lỗi.

Tôi đoán là nó đang sử dụng một số biến môi trường được đặt trong trình vỏ tương tác. Tôi sẽ khắc phục sự cố kịch bản và xóa chúng.

Sau khi tôi thực hiện các thay đổi, tôi biết rằng tôi có thể xếp hàng tập lệnh trong cron để nó chạy như bình thường, nhưng có cách nào để tôi có thể chạy tập lệnh từ dòng lệnh, nhưng bảo nó chạy như vậy từ cron - tức là trong môi trường không tương tác?


Liên quan và do đó có thể hữu ích: "Làm thế nào để có được một môi trường sạch trong vỏ ksh?" đặc biệt xem câu trả lời @Gilles liên quan unset.
sr_

1
Từ liên kết của @ sr_, tôi đã tra cứu envvà bạn có thể muốn thử env -i ./my-script.sh. Ngoài ra, bạn đang nhận được một thông báo lỗi?
Kevin

Bạn đang sử dụng cron nào?
rozcietrzewiacz

@kevin - Tôi sẽ nêu lên điều đó nếu bạn trả lời với nó.
cwd

Câu trả lời:


12

Sự khác biệt chính giữa chạy lệnh từ cron và chạy trên dòng lệnh là:

  • cron có thể đang sử dụng một vỏ khác (nói chung /bin/sh);
  • cron chắc chắn đang chạy trong một môi trường nhỏ (cái nào phụ thuộc vào việc thực hiện cron, vì vậy hãy kiểm tra trang cron(8)hoặc crontab(5)man; nói chung là có HOMElẽ SHELL, có lẽ LOGNAME, có lẽ USER, có lẽ và nhỏ PATH);
  • cron đối xử với %nhân vật đặc biệt (nó được chuyển thành một dòng mới);
  • công việc cron chạy mà không có một thiết bị đầu cuối hoặc môi trường đồ họa.

Lệnh gọi sau đây sẽ chạy đoạn mã shell khá nhiều như thể nó được gọi từ cron. Tôi giả sử đoạn trích không chứa các ký tự 'hoặc %.

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

Xem thêm thực thi một tập lệnh sh từ cron , có thể giúp giải quyết vấn đề của bạn.


Xin chào @Giles - chỉ cần nghĩ về một cái gì đó - sẽ chạy một tập lệnh như thế nào sudo -u user /path/to/scriptcũng là một cách để chạy nó mà không có bất kỳ biến nào được đặt?
cwd

@cwd Không, thường thì không. sudoxóa một số biến và đặt các biến khác thành một giá trị đã biết, nhưng điều đó phụ thuộc vào cách cấu hình của nó. Nó thường được cấu hình để giữ lại các cài đặt ngôn ngữ và TERM, ví dụ.
Gilles 'SO- ngừng trở nên xấu xa'

2

Từ liên kết của @ sr_ ( Làm thế nào để có được môi trường sạch trong vỏ ksh? ), Tôi đã tra cứu env và bạn có thể muốn thử điều này:

env -i ./my-script.sh

Điều này làm việc tốt cho tôi mặc dù câu trả lời @Gilles cũng thực sự tốt.
cwd

@cwd: Không hoạt động đối với tôi: echo -e '#!/bin/bash -i\necho interactive $-' > ~/test.sh && chmod +x ~/test.sh && env -i ~/test.shđầu ra interactive himB.
Alix Axel

1

Tôi sẽ đề nghị bạn sử dụng các đường dẫn tuyệt đối cho các tập lệnh của bạn khi đặt nó vào cron và sử dụng ở nơi khác và cho bất kỳ và tất cả các lệnh linux được sử dụng trong đó, tốt hơn là khai báo chúng dưới dạng các biến và sử dụng nó!


Đúng. nhưng đương nhiên là.
cwd

0

Cron không nhất thiết phải sử dụng cùng loại vỏ bạn đang sử dụng. kiểm tra:

cat /etc/crontab |grep SHELL

Để xác định trình bao và thử thực thi tập lệnh của bạn ở đó - nó có hoạt động không? Đây là một nguyên nhân phổ biến gây ra vấn đề cho nhiều người khi thêm tập lệnh vào cron.

Nếu đây là vấn đề - bạn có thể thêm "bash" vào đầu tập lệnh của mình bằng cron để buộc tập lệnh này thực thi trong bash. Nếu điều này không giải quyết được vấn đề, hãy cho tôi biết và tôi sẽ đào sâu hơn một chút.


0

Nếu bạn muốn bỏ qua một số câu hỏi tương tác được cung cấp bởi một số tập lệnh, bạn có thể thử:

yes | your_command

Hoặc yes "n"nếu bạn muốn Không có tất cả các câu hỏi.

Chỉ huy:

có - được lặp đi lặp lại khẳng định có kết quả đầu ra rõ ràng, hoặc, theo mặc định, 'y', mãi mãi.


0

Để chạy tập lệnh của bạn trong trình bao không tương tác (không liên quan đến các chi tiết của cron), bạn có thể thực hiện việc này thông qua ssh.

Kiểm tra nếu bạn thực sự kết thúc trong một vỏ không tương tác:

> ssh someuser@somehost tty
not a tty

Thực thi tập lệnh trong trình bao không tương tác:

> ssh someuser@somehost /tmp/myscript.sh
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.