รันสคริปต์ในเชลล์แบบไม่โต้ตอบหรือไม่


17

ฉันมีงาน cron ที่ใช้งานสคริปต์ เมื่อฉันรันสคริปต์ผ่านเชลล์แบบโต้ตอบ (ssh'ed to bash) มันใช้งานได้ดี เมื่อสคริปต์รันด้วยตัวเองผ่าน cron สคริปต์จะล้มเหลว

ฉันเดาว่ามันใช้ตัวแปรสภาพแวดล้อมบางอย่างที่ตั้งค่าไว้ในเชลล์เชิงโต้ตอบ ฉันจะแก้ไขปัญหาสคริปต์และลบสิ่งเหล่านี้

หลังจากที่ฉันทำการเปลี่ยนแปลงฉันรู้ว่าฉันสามารถจัดคิวสคริปต์ใน cron เพื่อให้มันทำงานได้ตามปกติ แต่มีวิธีที่ฉันสามารถเรียกใช้สคริปต์จากบรรทัดคำสั่ง แต่บอกให้ทำงานตามที่ cron - เช่นในสภาพแวดล้อมที่ไม่โต้ตอบหรือไม่


ที่เกี่ยวข้องและอาจเป็นประโยชน์: "วิธีการรับสภาพแวดล้อมที่สะอาดในเชลล์ ksh?" unsetดูคำตอบโดยเฉพาะอย่างยิ่งเกี่ยวกับการ @Gilles
sr_

1
จากการเชื่อมโยงของ @ sr_ ผมเงยหน้าขึ้นมองและคุณอาจต้องการที่จะลองenv env -i ./my-script.shคุณได้รับข้อความแสดงข้อผิดพลาดหรือไม่?
Kevin

คุณกำลังใช้ cron อะไร
rozcietrzewiacz

@kevin - ฉันจะ upvote ว่าถ้าคุณตอบกับมัน
cwd

คำตอบ:


12

ข้อแตกต่างที่สำคัญระหว่างการรันคำสั่งจาก cron และการรันบนบรรทัดคำสั่งคือ:

  • cron อาจใช้เชลล์อื่น (โดยทั่วไป/bin/sh);
  • cron แน่นอนทำงานในสภาพแวดล้อมที่มีขนาดเล็ก (คนซึ่งขึ้นอยู่กับการดำเนินงาน cron เพื่อตรวจสอบcron(8)หรือcrontab(5)หน้าคน; ทั่วไปมีเพียงHOMEบางทีSHELLอาจLOGNAMEบางทีUSERและขนาดเล็กPATH);
  • cron ปฏิบัติต่อ%ตัวละครเป็นพิเศษ (มันกลายเป็นบรรทัดใหม่);
  • งาน cron รันโดยไม่มีเทอร์มินัลหรือสภาพแวดล้อมแบบกราฟิก

การเรียกใช้ต่อไปนี้จะเรียกใช้ข้อมูลโค้ดของเชลล์สวยราวกับถูกเรียกจาก cron ผมถือว่าข้อมูลโค้ดไม่ได้มีตัวอักษรหรือ'%

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

โปรดดูการเรียกใช้สคริปต์ sh จาก cronซึ่งอาจช่วยแก้ปัญหาของคุณ


สวัสดี @Giles - แค่คิดถึงบางอย่าง - การใช้งานสคริปต์sudo -u user /path/to/scriptจะเป็นวิธีการเรียกใช้โดยไม่ตั้งค่าตัวแปรหรือไม่
cwd

@cwd ไม่ปกติ sudoล้างตัวแปรบางตัวและตั้งค่าอื่น ๆ เป็นค่าที่ทราบ แต่ขึ้นอยู่กับวิธีการกำหนดค่า มันมักจะถูกกำหนดค่าให้เก็บรักษาการตั้งค่าภาษาไว้และTERMตัวอย่างเช่น
Gilles 'หยุดความชั่วร้าย'

2

จากลิงก์ของ @ sr_ ( วิธีรับสภาพแวดล้อมที่สะอาดในเชลล์ ksh? ) ฉันค้นหา env และคุณอาจต้องการลองนี้:

env -i ./my-script.sh

สิ่งนี้ใช้ได้ดีสำหรับฉันแม้ว่าคำตอบของ @Gilles ก็ดีเหมือนกัน
cwd

@cwd: ไม่ทำงานสำหรับฉัน: เอาท์พุทecho -e '#!/bin/bash -i\necho interactive $-' > ~/test.sh && chmod +x ~/test.sh && env -i ~/test.sh interactive himB
Alix Axel

1

ฉันขอแนะนำให้คุณใช้เส้นทางที่แน่นอนสำหรับสคริปต์ของคุณเมื่อวางไว้ใน cron และใช้ที่อื่นและสำหรับคำสั่ง linux ใด ๆ และทั้งหมดที่ใช้ในนั้นดีกว่าประกาศให้เป็นตัวแปรและใช้มัน!


ใช่. แต่แน่นอน.
cwd

0

Cron ไม่จำเป็นต้องใช้เปลือกเดียวกันกับที่คุณใช้ ตรวจสอบ:

cat /etc/crontab |grep SHELL

เพื่อกำหนดเชลล์และพยายามเรียกใช้สคริปต์ของคุณที่นั่น - มันใช้งานได้หรือไม่ นี่เป็นสาเหตุทั่วไปของปัญหาสำหรับหลาย ๆ คนที่เพิ่มสคริปต์ลงใน cron

หากนี่เป็นปัญหาคุณสามารถเพิ่ม "bash" ไปยังจุดเริ่มต้นของสคริปต์ใน cron เพื่อบังคับให้สคริปต์นี้ดำเนินการใน bash หากวิธีนี้ไม่สามารถแก้ปัญหาได้โปรดแจ้งให้เราทราบและฉันจะขุดให้ลึกขึ้นเล็กน้อย


0

หากคุณต้องการเพิกเฉยต่อคำถามเชิงโต้ตอบที่จัดทำโดยสคริปต์บางตัวคุณสามารถลอง:

yes | your_command

หรือyes "n"ถ้าคุณต้องการที่จะไม่มีคำถามทั้งหมด

คำสั่ง:

ใช่ - ยืนยันซ้ำแล้วซ้ำอีกใช่เอาต์พุต expletive หรือโดยค่าเริ่มต้น 'y' ตลอดไป


0

เมื่อต้องการเรียกใช้สคริปต์ของคุณในเปลือกไม่โต้ตอบ (ไม่เกี่ยวกับรายละเอียดของการcron) sshคุณสามารถทำเช่นนี้ผ่านทาง

ทดสอบว่าคุณท้ายด้วยเชลล์ที่ไม่มีการโต้ตอบหรือไม่:

> ssh someuser@somehost tty
not a tty

เรียกใช้งานสคริปต์ในเชลล์ที่ไม่มีการโต้ตอบ:

> ssh someuser@somehost /tmp/myscript.sh
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.