ฉันจะใช้นามแฝงใน crontab ได้อย่างไร


16

ฉันมีคำสั่งบางอย่างในของฉันที่ฉันต้องการจะเรียกจากฉัน.profilecrontab

ตัวอย่างเช่นถ้าฉันมี

alias notify-me="~/bin/notify.pl -u user1"
alias notify-team="~/bin/notify.pl -u user1 user2 user3 user4 ...."

ฉันต้องการเรียกนามแฝง

0 11 * * * notify-team

ดังนั้นหากรายการในฉัน.profileได้รับการปรับปรุงฉันก็ไม่จำเป็นต้องอัปเดตcrontabด้วย อย่างไรก็ตามดูเหมือนว่าฉันจะไม่สามารถใช้ชื่อแทนcrontabได้ มีวิธีแก้ไขไหม?

ฉันลองคำแนะนำที่นี่เพื่อตั้งค่าสภาพแวดล้อม (เช่น / bin / bash -lc และสคริปต์-wrapper script) ดูเหมือนว่าจะใช้งานได้กับสคริปต์ แต่ไม่ใช่นามแฝง

ความคิดใด ๆ


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

คำตอบ:


10

จาก manpage เกี่ยวกับนามแฝง:

หมายเหตุนามแฝงจะไม่ถูกขยายตามค่าเริ่มต้นในเชลล์แบบไม่โต้ตอบ
และสามารถเปิดใช้งานได้โดยตั้งค่า 'expand_aliases'
ตัวเลือกเชลล์ใช้ shopt

ดังนั้นลองใช้shopt -s expand_aliasesเมื่อเริ่มต้นสคริปต์การจัดหาของคุณ สิ่งนี้จะช่วยให้คุณใช้คำแนะนำของ Warner ได้


นี่คือสำหรับฉันใน CentOS5 โดยค่าเริ่มต้น หมายเหตุเด็ด ๆ
Warner

อาจไม่ได้อยู่ในสคริปต์แม้ว่า shopt expand_aliasesลองสร้างสคริปต์ทดสอบที่เอาท์พุท ฉันเดิมพันมันปิด มันอยู่ในกล่อง RHEL 5.3 ของฉัน
Christopher Karel

คุณโดนเล็บที่หัว +1
Warner

+1 ขอบคุณสำหรับการชี้เรื่องนี้ มันทำให้ฉันได้รับวิธีแก้ปัญหาส่วนใหญ่ แต่ฉันก็ยังต้องสร้างไฟล์ใหม่ ฉันหวังว่าจะทำโดยปราศจากสิ่งนั้น
คี ธ Bentrup

Keith ฉันมีปัญหาเดียวกัน แต่การทำeval 'foo'crontab นั้นเป็นการหลอกลวง
Artem Russakovskii

6

bash -c กับ "source" ควรทำงานได้:

0 11 * * * bash -c "source .profile && notify-team"

สิ่งนี้อาจใช้งานได้ ระยะเวลาหมายถึง "แหล่งที่มา"

0 11 * * * . .profile && notify-team

3

ตามที่ Chris ระบุตัวเลือกเชลล์เริ่มต้นสำหรับเชลล์ที่ไม่ต้องมีการโต้ตอบคือไม่ขยายนามแฝง นี่เป็นวิธีแก้ปัญหาที่ฉันพบว่าทำงานได้

เขียนสคริปต์เปิดใช้งานตัวเลือกเชลล์และแหล่งนามแฝงของคุณ โปรดระวังเป็นพิเศษว่า.bashrcมีที่มาจากการดำเนินการซึ่งเป็นสาเหตุที่ทำให้ต้องได้รับแหล่งข้อมูลอีกครั้งหลังจากเปิดใช้งาน Expand_aliases

ฉันขอโทษสำหรับคำแนะนำที่ไม่ถูกต้องในตอนแรก นี่เป็นสิ่งที่คลุมเครือมากกว่าที่ฉันคิดไว้

สคริปต์:

#!/bin/bash
shopt -s expand_aliases
source /home/wmoore/.bashrc
notify-team

ขอบคุณ แต่ฉันพยายามแล้ว คุณยืนยันได้ไหมว่ามันใช้งานได้บนระบบของคุณ? ฉันได้ลอง / bin / bash -lc source ~ / .profile; การแจ้งเตือนทีมและรูปแบบอื่น ๆ นอกจากนี้ฉันไม่ต้องการให้มีสคริปต์แยกต่างหากสำหรับชื่อแทนแต่ละรายการ ที่เอาชนะวัตถุประสงค์ของการหลีกเลี่ยงการทำซ้ำ
Keith Bentrup

ฉันควรจะรวมข้อผิดพลาดจาก crontab: "ไม่พบคำสั่ง" ในทุกรูปแบบที่ฉันได้ลอง
Keith Bentrup

แก้ไขด้วยคำแนะนำทดสอบ
Warner

ขอบคุณสำหรับตัวอย่างที่อัปเดต ฉันคิดว่าถ้าคุณเพิ่ม -l ในบรรทัดแรกของคุณคุณสามารถกำจัดอันดับที่ 3 ของคุณได้
Keith Bentrup

อ่าการโทรที่ดี - ล็อกอินเชลล์จะเปิดใช้งาน expand_aliases
วอร์เนอร์

1

ฉันชอบแนวคิดของ artifex ที่จะดึงชื่อแทนออกจากไฟล์แล้วนำมาใช้ใหม่เนื่องจากฉันไม่สามารถหาวิธีขยาย / นำชื่อแทนกลับมาใช้ใหม่ได้โดยตรง (โซลูชันอื่นยังคงต้องใช้สคริปต์อื่น)

ดังนั้นฉันจึงเขียนฟังก์ชั่นนี้และใส่ไว้ใน. profile ของฉัน:

grab-alias () { sed -n '/alias\s*'$1'\s*=/ {s/[^'\'']*.//;s/'\''\s*$//p}' /home/bentrupk/.profile; }

จากนั้นฉันก็สามารถใช้มันใน crontab ของฉันสำหรับนามแฝงต่างๆเช่นนี้:

0 11 * * * /bin/bash -lc 'x=`grab-alias notify-team`; $x'
0 7 * * * /bin/bash -lc 'x=`grab-alias notify-me`; $x'

เป็นต้น

เย้โค้ดนำมาใช้ใหม่! ขอบคุณทุกคน


3
นั่นคือความชั่วร้ายที่บริสุทธิ์
Justin

ถ้าฉันสามารถใช้นามแฝงโดยตรงฉันจะ นั่นคือประเด็นของคำถาม คุณยินดีที่จะเสนอวิธีแก้ไขปัญหาอื่น แต่ฉันจะใช้วิธีแก้ปัญหานี้กับไฟล์ 2-3 บรรทัดจำนวนมากซึ่งทำให้ไดเรกทอรียุ่งเหยิงซึ่งเป็นสิ่งที่จะเกิดขึ้นเมื่อฉันเพิ่มรูปแบบการแจ้งเตือนเพิ่มเติมหรือตัดสินใจที่จะใช้นามแฝงอื่น ๆ
Keith Bentrup

1

สิ่งที่ง่ายที่สุดที่คุณสามารถทำได้คือการสร้าง

~ / bin / แจ้งเตือนฉันด้วย

#!/bin/sh
~/bin/notify.pl -u user1

~ / bin / แจ้งเตือนทีมด้วย

#!/bin/sh
~/bin/notify.pl -u user1 user2 user3 user4 ....

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


1
ขอบคุณสำหรับคำแนะนำ แต่ฉันไม่เคยคิดว่าชื่อแทนนั้นยากต่อการดูแลรักษาและฉันควรรักษาชื่อแทนของไฟล์ไว้ 1 ไฟล์จากนั้นจึงรักษาไฟล์หุ้มไฟล์จำนวนมาก ปัญหากำลังดำเนินการนามแฝงในงาน cron
Keith Bentrup

0

bash -ic "แจ้งเตือนทีม" เป็นตัวเลือกที่ดีที่สุด มันทำให้นามแฝงอยู่ใน crontab คุณอาจเพิ่ม & สำหรับพื้นหลังเพิ่มเติมเมื่อเราใช้เชลล์ 'แบบโต้ตอบ' กับ -i แต่ในความเป็นจริงไม่ได้โต้ตอบกับมัน


-2
0 11 * * * bash -ic "notify-team" > /log/file

ทำงานได้สำหรับฉัน


1
คำอธิบายบางคำจะช่วยปรับปรุงคำตอบ
Dave M
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.