dポイントプレゼントキャンペーン実施中!

操作ミスでcronの設定が削除されてしまいました。
crontabの貧弱なフールプルーフについて訴えたい事も少々ありますが、ひとまず置いておきます。
少し調べたのですが、復元は無理っぽいということで、一から作り直すことにしました。
cronの設定をしたのは、だいぶ前なのでほとんど忘れています。
まずパスの設定をすべくcrontabの先頭で、
PATH=/home/webmaster/bin:$PATH
* * * * * echo $PATH >tmp
としたところ、
$ cat tmp
/home/webmaster/bin:$PATH
のように$PATHが展開されずに、そのまま文字列として設定されていました。
crontabで$PATHにディレクトリを追加するには、どうすればよいのでしょうか。

A 回答 (3件)

cron によっては


できない
かもしれないらしい. あなたの使っている cron でできるかどうかはわからないので, まずはマニュアルを読んでみてはどうだろうか.

「フールプルーフ」は... ある意味「UNIX の精神」に反するかもしれん....
    • good
    • 0
この回答へのお礼

cronによってはできないのですね。。。
たぶん私のcronはできないのでしょう。。。
しかたないので$PATHの内容を調べて手打ちすることにしました。

PATH=/home/webmaster/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
ダサいですね。どんなもんでしょう。。。

そうですねUNIXの精神に賛同して使ってきたのですもんね。
あの時もっと慎重になっていれば回避できてましたから。
だけどむかつきます

お礼日時:2021/10/01 05:55

私はご質問者様の意図をよく理解していないかも知れないのですが、実験をしてみました。


尚、私のデフォルトシェルはcshですのでご注意下さい。

●crontabsファイルに次の1行を追加する。

# 毎分起動。
* * * * * /hoge/hoge/MyShell

●MyShellは次の2行です。

#!/bin/csh
echo $path >> /tmp/tmp

●さらに$HOME/.cshrcファイルのpath変数の設定を、次の1行に書き換えました。

   |   |   |
   |   |   |
set path=/tmp/MyPath
   |   |   |
   |   |   |

こうしてcronを再起動すると、/tmp/tmpファイルは次のようになります。

/tmp/MyPath
/tmp/MyPath
/tmp/MyPath
/tmp/MyPath
| | |

私が言いたいことは、cronからご質問者が自ら製作したスクリプトを呼び出すようにすれば、$PATH変数に限らず、シェルの環境を如何様にも変更できるはず。

1.デフォルトではパスが通っていない実行ファイルや、スクリプトを起動したいのなら、cronが呼び出すスクリプト(MyShell)の中でフルパスで指定すれば良い。

2.単にアカウントのデフォルトパスを利用したいのなら、この例で示したようにMyShellのシェバン(この例では"#!/bin/csh")の設定で、$HOME/.cshrcの設定を引き継げば良い。
    • good
    • 0
この回答へのお礼

ちょっと、やろうと思いましたが、すぐ挫折しました。

やりたい事は、2.単にアカウントのデフォルトパスを利用したいだけです。

当方bashすら使いこなせてないので、cshは意味不明です。

.bashrcなるものを開くのも初かもしれません。
.bashrcに$PATHを設定する記述は見当たりませんでした。
bashでは、
PATH=/home/webmaster/bin:$PATH
のようにして$PATHを設定します。

いけてないですが、No.1さんに回答を頂いた段階でcrontab -eで$PATHをリテラル値で設定して、今のところ正常に動いているようです^^

ですので本件の緊急性はなくなりましたが、cronで簡単にアカウントのデフォルトパスを利用する方法(bashで)を引き続き募集させていただきます。

遅ればせながら私のシステムは#99-Ubuntuというものらしいです。
$ uname -v
#99-Ubuntu SMP Thu Sep 23 17:29:00 UTC 2021

お礼日時:2021/10/04 18:58

cron実行全体にかかるパス設定になるので、下手を打つと他のcron実行対象を誤動作させる恐れがあります。



各cron行で、環境変数を明示するか、envコマンドやシェルスクリプトでラッピングするほうが安全かと。
    • good
    • 0
この回答へのお礼

環境変数を明示するとは、PATHを含む全ての環境変数を設定するということでしょうか。
例えば、どのように書きますか?
また各cron行で明示するとは、例えばcrawl、bakの2つを実行するには、
PATH=/home/webmaster/bin:/hogehoge
0 0 * * * crawl
PATH=/home/webmaster/bin:/hogehoge
0 1 * * * bak
のように$PATHの設定も2回するということでしょうか。
これはcrontabの先頭で1回だけ$PATHを設定する場合と、どのような挙動の違いが考えられますか。
またenvコマンドやシェルスクリプトでラッピングするというのは分かりません。
例えばcrawl、bakの2つを実行したい場合には、crontab -eでどのように書くのですか。

お礼日時:2021/10/01 16:37

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!