最近、私は徐々にシェルを次に切り替え始めました。怒っている このため、cronからSHELLにパスを割り当てることを検討しました。
ほとんどのマニュアルを読んだ後、man 5 crontab
PATHを見て:
SHELLに値を割り当てたい2つのシェルの間で使用されているルールをコピーしました。
SHELL=/bin/bash:/home/jerzy/.cargo/bin/nu
動作しません。私のcrontabのスクリプトは正しく動作しません。そして両方ともうまくSHELL=/bin/bash
いきます
SHELL=/home/jerzy/.cargo/bin/nu
。
SHELLに2つのシェルを割り当てることはできますか?これは言う?
答え1
いいえ、2つのシェルを割り当てることはできませんSHELL
。cron
起動するシェルを知っておく必要があり、1つしか存在できません。変数が指定されSHELL
ていません。crontab
可能指定するシェルこれ使用するシェル。 (存在する場合)cron
値を読み取り、SHELL
それを実行コマンドとして使用します。解釈し:
たり、他の記号は使用しません。
フォールバックも機能しません。何らかの理由で失敗した場合は、理由のために失敗したのか、nu
他の理由で失敗したのかをcron
知る方法はありません。nu
ほとんどのスクリプトは特定のインタプリタ(shebangで指定)用に作成され、1つのインタプリタを使用してスクリプトを実行し、別のインタプリタを使用して実行することはできません。同様に、エントリは指定された(デフォルト以外の場合)念頭に置いてcrontab
作成されます。SHELL
/bin/sh
答え2
いいえ、SHELL
次の理由で複数のシェルを持つことは意味がありません。@Stephenは答えで説明されています。。ただし、この変数は、少なくともLinuxシステムで一般的に使用されるVixie cronで行の即時コマンド部分を実行するためにSHELL
シェルが使用する項目のみを制御します。 。cron
crontab
SHELL
crontab
Debian のマニュアルページ説明するcrontab(5)
:
crontabファイルは上から下に解析されるため、すべての設定はファイルの下にあるcronコマンドにのみ影響します。
この文は Debian で追加したようですが、私が使った CentOS システムでも同じ効果を発揮するようです。しかし、Toby Speightが彼の意見で指摘したように、環境変数の割り当てはcrontab
POSIX機能がまったくないのでYMMVです。
したがって、cronに関係なく、次のことができる必要があります。
* * * * * /path/to/somescript.py maybe
* * * * * /path/to/otherscript.pl some
* * * * * /path/to/thirdscript.sh args
スクリプトに正しいhashbang行がある場合(たとえば#!/usr/bin/python3
、#!/usr/bin/perl
など#!/bin/bash
)をコマンドとして渡すことができるようにSHELL
設定し、引数を使用してスクリプトを実行します。/path/to/somescript.py maybe
ほとんどのシェルはマイナーなアイテムを同じようにサポートしているため、複雑なアイテムを別のスクリプトに入れて行を単純crontab
に保つことで、スクリプト自体ですべてのシェルまたはスクリプト言語を使用できます。
直接crontabコマンドで別のシェルを使用する必要がある場合は、少なくともVixie cronでこれを実行できます。
SHELL=/bin/bash
* * 8-14 * * if test "$(date +\%w)" = 0; then echo $BASH_VERSION > /tmp/bashtest; fi
SHELL=/usr/bin/fish
* * 8-14 * * if test (date +\%w) = 0; echo $FISH_VERSION > /tmp/fishtest; end
どちらも日付が日曜日であることを確認し、そうであれば、Bashを使用するシェルバージョンとFishを使用するシェルバージョンを印刷します。 (もちろんこれは単なる例ですが、cron timeの設定がどのように機能するかによって毎月最初/2番目/最後の特定の作業日に実行されるのは、crontabでシェルコードを使用する一般的な状況の1つです。)
また、コメントでは、Nuは複数行のコマンドをサポートしておらず、\
そこでBashを使用できることを望んだと述べました。 crontab 行に複数行のコマンドを使用することはできません。コマンド自体はファイル内の1行にする必要があり、crontabシンボルを改行文字としてcron
使用すると、%
最初の行から次の行がコマンドに送信されます。 。 (これが上記の%
形式文字列で使用したものをエスケープする必要がある理由ですdate
。)