481

crontabには、エディターを使用せずにcronジョブを作成するための引数がありますか(crontab -e)。もしそうなら、Bashスクリプトからcronジョブを作成するコードは何でしょうか?

4

21 に答える 21

647

次のようにcrontabに追加できます。

#write out current crontab
crontab -l > mycron
#echo new cron into cron file
echo "00 09 * * 1-5 echo hello" >> mycron
#install new cron file
crontab mycron
rm mycron

cronラインの説明

* * * * * "command to be executed"
- - - - -
| | | | |
| | | | ----- Day of week (0 - 7) (Sunday=0 or 7)
| | | ------- Month (1 - 12)
| | --------- Day of month (1 - 31)
| ----------- Hour (0 - 23)
------------- Minute (0 - 59)

ソースnixCraft

于 2009-05-18T16:47:43.240 に答える
363

あなたはその場でそれをすることができるかもしれません

crontab -l | { cat; echo "0 0 0 0 0 some entry"; } | crontab -

crontab -l現在のcrontabジョブを一覧表示し、catそれをecho印刷し、新しいコマンドをcrontab -印刷し、印刷されたすべてのものをcrontabファイルに追加します。新しいを実行すると、効果を確認できますcrontab -l

于 2009-05-18T18:02:42.837 に答える
106

この短いファイルは一時ファイルを必要とせず、複数の挿入の影響を受けず、既存のエントリのスケジュールを変更できます。

あなたがこれらを持っているとしましょう:

croncmd="/home/me/myfunction myargs > /home/me/myfunction.log 2>&1"
cronjob="0 */15 * * * $croncmd"

重複せずにcrontabに追加するには:

( crontab -l | grep -v -F "$croncmd" ; echo "$cronjob" ) | crontab -

現在のスケジュールに関係なく、crontabから削除するには:

( crontab -l | grep -v -F "$croncmd" ) | crontab -

ノート:

  • grep -Fは文字列に文字通り一致します。これは、文字列を正規表現として解釈したくないためです。
  • また、タイムスケジューリングを無視し、コマンドのみを探します。こちらです; crontabに新しい行を追加するリスクなしにスケジュールを変更できます
于 2013-07-31T16:05:54.533 に答える
42

皆さんの助けに感謝します。ここや他の場所で見つけたものをつなぎ合わせて、これを思いついた:

コード

command="php $INSTALL/indefero/scripts/gitcron.php"
job="0 0 * * 0 $command"
cat <(fgrep -i -v "$command" <(crontab -l)) <(echo "$job") | crontab -

自分自身を繰り返さずに、2つの変数の必要性を排除する方法を理解できませんでした。

command明らかに私がスケジュールしたいコマンドです。スケジューリングデータを取得して追加しますjob$command作業を行うコード行で、両方の変数を別々に必要としました。

詳細

  1. duckyflipの功績です。この小さなリダイレクト(<(*command*))を使用して、の出力をコマンドcrontab -lの入力に変換しますfgrep
  2. fgrep$command次に、 (-vオプション)、大文字と小文字を区別しない(オプション)の一致をすべて除外し-iます。
  3. ここでも、小さなリダイレクトthingy(<(*command*))を使用して、結果をコマンドの入力に戻しますcat
  4. このコマンドは、redirectthingy()を使用して(自明)catも受け取ります。echo "$job"<(*command*)
  5. したがって、フィルタリングされた出力crontab -lと単純なecho "$job"、結合されたものはcrontab -、最終的に書き込まれるようにパイプ('|')されます。
  6. そして、彼らは皆、その後ずっと幸せに暮らしました!

一言で言えば:

このコード行は、コマンドに一致するすべてのcronジョブを除外し、残りのcronジョブを新しいもので書き出して、効果的に「追加」または「更新」機能のように機能します。commandこれを使用するには、変数と変数の値を交換するだけjobです。

于 2011-11-12T18:08:47.917 に答える
29

編集(上書きを修正):

cat <(crontab -l) <(echo "1 2 3 4 5 scripty.sh") | crontab -
于 2009-05-18T16:49:38.773 に答える
22

crontabの使用に関しては多くの良い答えがありますが、を使用するなどのより単純な方法については言及されていませんcron

を使用すると、、または:cronにあるシステムファイルとディレクトリを利用できます。/etc/crontab/etc/cron.daily,weekly,hourly/etc/cron.d/

cat > /etc/cron.d/<job> << EOF
SHELL=/bin/bash 
PATH=/sbin:/bin:/usr/sbin:/usr/bin 
MAILTO=root HOME=/  
01 * * * * <user> <command>
EOF

上記の例では、でファイルを作成し/etc/cron.d/、コマンドを正常に実行するための環境変数を提供しuser、コマンドとcommandそれ自体のを提供しました。このファイルは実行可能ではなく、名前には英数字とハイフンのみを含める必要があります(詳細は以下を参照)。

crontabしかし、完全な答えを与えるために、 vsの違いを見てみましょうcron/crond

crontab -- maintain tables for driving cron for individual users

システム上のユーザーのコンテキストでジョブを実行したい場合は、を使用するのcrontabが理にかなっている場合があります。

cron -- daemon to execute scheduled commands

構成管理を使用している場合、または他のユーザーのジョブを管理したい場合は、を使用する必要がありますcron

マンページからの簡単な抜粋は、すべきこととすべきでないことのいくつかの例を示しています。

/ etc / crontabおよび/etc/cron.d内のファイルは、rootが所有している必要があり、グループまたはその他の書き込みが可能であってはなりません。スプール領域とは対照的に、/ etc / cron.dの下のファイル、または/etc/cron.hourly、/etc/cron.daily、/etc/cron.weekly、および/etc/cron.monthlyの下のファイルもsymlinks。ただし、symlinkとそれが指すファイルの両方がrootによって所有されている場合。/etc/cron.dの下のファイルは実行可能である必要はありませんが、/ etc / cron.hourly、/ etc / cron.daily、/ etc / cron.weekly、および/etc/cron.monthlyの下のファイルは実行可能である必要があります。これらはrun-partsによって実行されます(詳細については、run-parts(8)を参照してください)。

ソース: http: //manpages.ubuntu.com/manpages/trusty/man8/cron.8.html

この方法でcronを管理することは、システムの観点からはより簡単でスケーラブルですが、常に最良のソリューションであるとは限りません。

于 2017-03-13T21:46:13.247 に答える
10

したがって、Debian、Ubuntu、および多くの同様のDebianベースのディストリビューションでは...

構成ファイルを取得し、それらをバンドルして、実行中のcronサービスに追加するcronタスク連結メカニズムがあります。

/etc/cron.d/somefilenameの下にファイルを置くことができます。somefilenameは任意です。

sudo echo "0,15,30,45 * * * * ntpdate -u time.nist.gov" >> /etc/cron.d/vmclocksync

これを分解しましょう:

sudo-/etcディレクトリの下のcron設定を変更するには昇格された権限が必要なため

echo-標準出力で出力を作成するための手段。printf、cat...も機能します

"-文字列の先頭に二重引用符を使用してください、あなたはプロです

0,15,30,45 * * * *-標準のcron実行スケジュール、これは15分ごとに実行されます

ntpdate-utime.nist.gov-実行したい実際のコマンド

"-私の最初の二重引用符は、出力されている行を閉じるためにバディが必要なためです

>>-上書きの代わりに二重リダイレクトが追加されます*

/etc/cron.d/vmclocksync-vmclocksyncは私が選択したファイル名で、/ etc /cron.d/にあります。


*リダイレクトを使用した場合、タスクエントリが1つしかないことを保証できます。ただし、既存のファイル内の他のルールを吹き飛ばすリスクがあります。>を使用した破壊の可能性が正しいか、>>を使用した重複の可能性が適切かどうかを自分で判断できます。または、複雑なことや複雑なことを行って、ファイル名が存在するかどうか、ファイル名に何かがあるかどうか、複製を追加しているかどうかを確認することもできますが、やるべきことがあるので、それを行うことはできません。あなたは今。

于 2018-10-25T15:08:14.207 に答える
7

これを自動化している可能性があり、1つのジョブを2回追加したくない場合があります。その場合、以下を使用します。

__cron="1 2 3 4 5 /root/bin/backup.sh"
cat <(crontab -l) |grep -v "${__cron}" <(echo "${__cron}")

これは、BASHを使用している場合にのみ機能します。正しいDASH(sh)構文を認識していません。

更新:ユーザーがまだcrontabを持っていない場合、これは機能しません。より信頼性の高い方法は次のとおりです。

(crontab -l ; echo "1 2 3 4 5 /root/bin/backup.sh") | sort - | uniq - | crontab - 

または、ディストリビューションがサポートしている場合は、別のファイルを使用することもできます。

echo "1 2 3 4 5 /root/bin/backup.sh" |sudo tee /etc/crond.d/backup

別のSOの質問でそれらを見つけました。

于 2010-07-19T09:24:14.247 に答える
7

BASHスクリプトを使用してcrontabをすばやく汚く作成/置換するために、次の表記法を使用しました。

crontab <<EOF
00 09 * * 1-5 echo hello
EOF
于 2014-05-29T17:02:58.483 に答える
5

目的の文字列がそこに見つからない場合にのみcrontabを編集するバリアント:

CMD="/sbin/modprobe fcpci"
JOB="@reboot $CMD"
TMPC="mycron"
grep "$CMD" -q <(crontab -l) || (crontab -l>"$TMPC"; echo "$JOB">>"$TMPC"; crontab "$TMPC")
于 2015-11-21T10:21:29.020 に答える
5
echo "0 * * * * docker system prune --force >/dev/null 2>&1" | sudo tee /etc/cron.daily/dockerprune
于 2019-05-23T22:10:40.263 に答える
3

たとえばほとんどのLinuxディストリビューションでVixieCronを使用している場合は、個々のcronjobを使用して/etc/cron.dにファイルを配置するだけです。

もちろん、これはルートに対してのみ機能します。システムがこれをサポートしている場合は、そこにいくつかの例が表示されます。(古い/ etc / crontabと同じ構文で、行に含まれているユーザー名に注意してください)

これを通常のユーザーとして処理する方法がないこと、および非常に多くのcron実装がこれを処理する方法がまったくないことは、cronの悲しい誤解です。

于 2009-05-22T21:28:56.853 に答える
2

これに対する私の好ましい解決策はこれです:

(crontab -l | grep . ; echo -e "0 4 * * * myscript\n") | crontab -

これにより、下部の空白の改行が正しく処理されていることを確認できます。crontabの問題を回避するには、通常、crontabファイルを空白の改行で終了する必要があります。また、上記のスクリプトは、最初に「grep」を含む空白行をすべて削除することを確認します。パートし、スクリプトの最後に「\n」を付けて新しい空白行を最後に追加します。これにより、既存のcrontabファイルが空白行で終わっている場合に、新しいコマンドの上に空白行が表示されるのを防ぐこともできます。

于 2018-09-08T12:29:34.660 に答える
2

インタラクティブエディタなしでcronジョブを追加するためのBashスクリプト。以下のコードは、Linuxファイルを使用してcronジョブを追加するのに役立ちます。

#!/bin/bash

cron_path=/var/spool/cron/crontabs/root

#cron job to run every 10 min.
echo "*/10 * * * * command to be executed" >> $cron_path

#cron job to run every 1 hour.
echo "0 */1 * * * command to be executed" >> $cron_path
于 2018-12-18T12:29:33.837 に答える
2
(2>/dev/null crontab -l ; echo "0 3 * * * /usr/local/bin/certbot-auto renew") | crontab -
cat <(crontab -l 2>/dev/null) <(echo "0 3 * * * /usr/local/bin/certbot-auto renew") | crontab -

#現在のcrontabを書き出す

crontab -l > mycron 2>/dev/null

#echo new cron into cron file

echo "0 3 * * * /usr/local/bin/certbot-auto renew" >> mycron

#新しいcronファイルをインストールする

crontab mycron

rm mycron
于 2020-09-23T09:39:01.483 に答える
1

crontabこれは、重複せずにコマンドを追加するためのbash関数です。

function addtocrontab () {
  local frequency=$1
  local command=$2
  local job="$frequency $command"
  cat <(fgrep -i -v "$command" <(crontab -l)) <(echo "$job") | crontab -
}
addtocrontab "0 0 1 * *" "echo hello"
于 2017-06-03T20:48:19.183 に答える
1
CRON="1 2 3 4 5 /root/bin/backup.sh" 
cat < (crontab -l) |grep -v "${CRON}" < (echo "${CRON}")

-wパラメータをgrepexactコマンドに追加します。-wパラメータを追加せずにcronjob"testing"を追加すると、cronジョブ"testing123"が削除されます。

cronジョブを追加/削除するスクリプト関数。重複エントリなし:

cronjob_editor () {         
# usage: cronjob_editor '<interval>' '<command>' <add|remove>

if [[ -z "$1" ]] ;then printf " no interval specified\n" ;fi
if [[ -z "$2" ]] ;then printf " no command specified\n" ;fi
if [[ -z "$3" ]] ;then printf " no action specified\n" ;fi

if [[ "$3" == add ]] ;then
    # add cronjob, no duplication:
    ( crontab -l | grep -v -F -w "$2" ; echo "$1 $2" ) | crontab -
elif [[ "$3" == remove ]] ;then
    # remove cronjob:
    ( crontab -l | grep -v -F -w "$2" ) | crontab -
fi 
} 
cronjob_editor "$1" "$2" "$3"

テスト済み:

$ ./cronjob_editor.sh '*/10 * * * *' 'echo "this is a test" > export_file' add
$ crontab  -l
$ */10 * * * * echo "this is a test" > export_file
于 2017-09-04T12:47:31.817 に答える
0

いいえ、crontabにはcronファイルを変更するオプションはありません。

現在のcronファイルを取得し(crontab -l> newfile)、変更して新しいファイルを配置します(crontab newfile)。

perlに精通している場合は、このモジュールConfig::Crontabを使用できます。

LLP、アンドレア

于 2009-05-18T16:53:51.230 に答える
0

cronジョブを追加するスクリプト関数。重複するエントリ、使用可能な式を確認してください*> "

cronjob_creator () {         
# usage: cronjob_creator '<interval>' '<command>'

  if [[ -z $1 ]] ;then
    printf " no interval specified\n"
elif [[ -z $2 ]] ;then
    printf " no command specified\n"
else
    CRONIN="/tmp/cti_tmp"
    crontab -l | grep -vw "$1 $2" > "$CRONIN"
    echo "$1 $2" >> $CRONIN
    crontab "$CRONIN"
    rm $CRONIN
fi
}

テスト済み:

$ ./cronjob_creator.sh '*/10 * * * *' 'echo "this is a test" > export_file'
$ crontab  -l
$ */10 * * * * echo "this is a test" > export_file

ソース:私の脳;)

于 2017-09-03T16:00:13.647 に答える
0

ユーザー「ubuntu」としてログインしているが、たとえば「john」など、別のユーザーのcrontabにジョブを追加するとします。次のことができます。

(sudo crontab -l -u john; echo "* * * * * command") | awk '!x[$0]++' | sudo crontab -u john -

このソリューションのほとんどのソース:https ://www.baeldung.com/linux/create-crontab-script

別のユーザーのcrontabにジョブを追加しようとすると、多くの問題が発生していました。crontabを複製し続けたり、完全に削除したりしました。ただし、いくつかのテストの後、このコード行は、既存のジョブを作成しないことを含め、非破壊的に、指定されたユーザーのcrontabに新しいジョブを追加すると確信しています。

于 2021-09-24T21:04:04.787 に答える
0

私はこのような例を見つけたかったので、多分それは役に立ちます:

COMMAND="/var/lib/postgresql/backup.sh"
CRON="0 0 * * *"
USER="postgres"
CRON_FILE="postgres-backup"
# At CRON times, the USER will run the COMMAND
echo "$CRON $USER $COMMAND" | sudo tee /etc/cron.d/$CRON_FILE
echo "Cron job created. Remove /etc/cron.d/$CRON_FILE to stop it."
于 2021-11-22T17:09:10.447 に答える