crontab에서 별칭을 사용하는 방법은 무엇입니까?


16

.profile에서 호출하려는 일부 명령이 crontab있습니다.

예를 들어 내가 가지고 있다면

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 및 스크립트 래퍼 스크립트). 스크립트에서는 작동하지만 별칭은 작동하지 않는 것 같습니다.

어떤 아이디어?


유용한 정보를 제공해 주셔서 감사합니다. 내 자신을 포함한 몇 가지 가능한 솔루션. 궁극적으로 Artifex의 독창적 인 아이디어를 내 상황에 더 유용한 것으로 수정했습니다. Chris는 별도의 스크립트로 필요한 정보를 제공했습니다.
Keith Bentrup

답변:


10

별명에 관한 맨 페이지에서 :

비 대화식 쉘에서는 기본적으로 별칭이 확장되지 않습니다.
'expand_aliases'를 설정하여 활성화 할 수 있습니다
shopt를 사용하는 쉘 옵션.

따라서 shopt -s expand_aliases소싱 스크립트 시작시 사용하십시오. 이를 통해 워너의 제안을 사용할 수 있습니다.


CentOS5에서는 기본적으로 켜져 있습니다. 그래도 멋진 메모입니다.
Warner

아마도 스크립트에는 없을 것입니다. 출력하는 테스트 스크립트를 작성하십시오 shopt expand_aliases. 나는 그것이 꺼져 내기. 내 RHEL 5.3 상자에 있습니다.
Christopher Karel

당신은 머리에 못을 쳤다. +1
워너

이것을 지적 +1 Thx. 솔루션으로가는 길을 대부분 얻었지만 여전히 다른 파일을 만들어야합니다. 나는 그것없이 그것을하기를 바랐다.
Keith Bentrup

키이스, 나는 같은 문제가 있었지만 eval 'foo'crontab에서하는 것이 속임수였습니다.
Artem Russakovskii 2018 년

6

"source"가있는 bash -c가 작동해야합니다.

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

Thx,하지만 이미 시도했습니다. 시스템에서 작동하는지 확인할 수 있습니까? 나는 또한 / bin / bash -lc source ~ / .profile을 시도했다. 통지 팀 및 기타 변형. 또한 각 별칭마다 별도의 스크립트를 사용하지 않는 것이 좋습니다. 그것은 중복을 피하려는 목적을 무너 뜨립니다.
Keith Bentrup

시도한 모든 변형에 대해 crontab의 "command not found"오류를 포함시켜야합니다.
Keith Bentrup

테스트 된 권장 사항으로 편집했습니다.
Warner

업데이트 된 예제의 Thx 첫 번째 줄에 -l을 추가하면 세 번째 줄을 제거 할 수 있다고 생각합니다.
Keith Bentrup

아, 전화가 좋았습니다. 로그인 셸에서 expand_aliases가 활성화되었습니다.
Warner

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 / notify-me

#!/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 "notify-team"이 최선의 선택입니다. crontab에서 별칭을 사용할 수있게합니다. -i와 함께 '대화식'쉘을 사용하고 있지만 실제로는 상호 작용하지 않으므로 배경에 &를 추가 할 수 있습니다.


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

나를 위해 일한다


1
약간의 설명은 답을 향상시킬 것입니다
Dave M
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.