手動では動くのに自動実行だと動かないのは、設定の不備ではなく、その場に人がいないからである

決まった時刻に走らせたい作業があります。手順は書き、実行の予約も入れました。試しに手で押してみると、最後まできちんと動きます。

それなのに、その時刻になっても何も起こりません。エラーの表示もなく、ログにも記録が残っていない。もう一度手で押すと、また何事もなく動きます。

よく言われる答えは、だいたい3つです。実行するユーザーの権限を変える、開始するフォルダを指定する、マシンがスリープしないようにする。どれも当たることがありますが、当たったときも、なぜ当たったのかは分からないままです。

この記事が立てる問いは違います。手で押したときと、時刻が来て走ったときで、何が変わったのでしょうか。

目次

手で押すとき、人は実行のほかにいくつかのことを済ませている

手で押して動いたという事実は、押す一手が正しかったことだけを証明しているのではありません。押す前の状態が揃っていたことも、まとめて証明しています。

押す直前、あなたはログインしていて、画面が出ています。特定のフォルダを開いた状態でいて、使っているシェルには起動時の設定が読み込まれています。マシンは当然、起きています。そして何か許可を求められたら、その場で押せる位置にいます。

これらは全部、押す前に済んでいるので、押すという一手だけで最後まで動きます。

自分でやったという感覚が残るのは最後の一手だけで、その手前の準備は意識に上がりません。

自動実行で抜けるのは、人が済ませていた分である

時刻が来て走るとき、再現されるのは最後の一手だけで、その手前の分は再現されません。

具体的に、3つの環境で見てみます。

Unix系のcronは、決められた最小の環境で処理を起動します。SHELLは/bin/sh、PATHは/usr/bin:/binが初期値で、ログインしたときに読み込まれる設定ファイルはここでは読まれません。だから、手元では名前を打つだけで動くコマンドが、cronからは見つからないことがあります。

macOSでは、画面のあるセッションに属していないプロセスは権限を求めるダイアログを表示できず、応答を待ったまま止まります。押す人がいないのではなく、押すための画面がそもそも出ないのです。

Windowsのタスクスケジューラでは、実行時刻にマシンがオフだった場合、一回限りに設定したトリガーは再起動後にも実行されません。これは不具合ではなく、仕様としてそう書かれています。

なお、この3つはどれも手抜きの結果ではありません。人がその場にいる状態を前提にしたほうが、安全の側へ倒せるからです。画面を出せない場所で許可を勝手に通してしまえば、許可という仕組みそのものが意味を失います。止まるのは、設計として正しい振る舞いなのです。

ここは事実と解釈を分けておきます。3つに共通の原因があると証明されているわけではありません。別の会社が、別の目的で作った、別の仕組みです。ここで指摘できるのは、3つとも人がその場にいるかどうかで結果が変わるという事実だけです。

エラーが出ないので、人は設定のほうを疑い続ける

この失敗は、静かに起こります。止まったという知らせは来ず、朝になっても何も無いだけです。

実行するユーザーを変えてみる、開始フォルダを指定してみる、スリープを切ってみる。すでに試した方も多いと思います。そして、たまに当たります。

当たった理由も、同じ構造で説明がつきます。実行ユーザーを変えるのはログインしている状態を作り直すことで、開始フォルダの指定はあなたが開いていた場所を手で書き足すことです。スリープを切るのは、起きているという条件を戻すことになります。どれも、人が済ませていた分を1つ埋めています。

だから直ります。ただし埋めたのは1つだけで、残りがあと何個あるかは分かっていません。

原因が分からないまま直った、という感覚が残るのはこのためです。直し方が間違っていたのではなく、直した対象が全体の一部だっただけです。

人がいる時間に、いない時間の分を先に通しておく

毎回1回だけ押す確認は、人がいるあいだは摩擦で済みます。面倒ではあっても、押せば進むからです。同じ確認が、人のいない時間には停止装置に変わります。仕組みは何も変わっていません。変わったのは、押す人がいるかどうかだけです。

だから、やることは1つになります。誰もいない時間に必要になるものを、人がいる時間のうちに済ませておく。

macOSでこの問題を扱う人たちは、実際にこの順序で回避しています。画面のある側で先に許可のダイアログを出して通し、そのあとで背後の処理に引き継がせる。出せない場所で出そうとするのではなく、出せる場所で先に出しておく、という組み方です。

手順はどの環境でも同じ形になります。無人で走らせる前に、昼のうちに手で1回走らせて、そのとき出てくる許可を全部通しておく。

作業としては数分で終わります。そして、これをやらないと、夜のあいだ許可を待ったまま朝を迎えることになります。

空の材料で試すと、足りない場所が最後まで出てこない

ここに、見落としやすい穴があります。

許可というものは、その操作が実際に発生したときにしか要求されません。発生しなければ聞かれませんし、聞かれないものは通しようがありません。

だから、材料を空にしたままテストを走らせると、途中までしか進みません。フォルダを読む許可は出ますが、読んだ先に何も無ければ処理はそこで終わります。ファイルを外へ送る許可は、一度も要求されないままです。

このテストは、成功したように見えます。画面の上では最後まで走っていて、エラーも出ていない。通っていない許可が1つ残っていることは、どこにも表示されません。

そして夜、送る段になって初めて止まります。

判定は1つです。リハーサルは、本番と同じ材料で走らせる。中身が空のまま一度通したことは、通したうちに入りません。

先に通すことのコストを、正直に書いておく

公平を期すために、逆側も書きます。

先に全部の許可を通すということは、その場で止める機会を自分から捨てるということです。夜のあいだに想定と違うことが起きても、確認は出てきません。出てこないように設定したのだから、当然です。

通した許可は、次に自分が忘れた頃にも有効です。半年後に同じ経路で別の処理が走ったときにも聞かれないので、何を通したかを覚えていないと、範囲は自分の想定より広くなります。

そしてもう1つ、正直に書いておくべきことがあります。この手当てで防げるのは止まることだけで、事故のほうは防げません。

止まらなくなったということは、間違った動きも止まらないということです。だから、先に通す許可は取り返しのつく操作に限るのが、順序として先になります。送る、公開する、消す。この種の操作まで含めて通してしまうと、朝に取り返せないものが出来上がっている可能性が残ります。

判断基準は、その工程が人のいることを当てにしているかどうかである

明日から使える形にすると、確かめ方は1つです。

手で押す前に自分が何をしているかを、順に書き出してみる。パソコンの前に座った、ログインした、あのフォルダを開いた、あの画面を出した、そして押した。

書き出したものが、自動実行の側にも用意されているか。用意されていない項目が、そのまま止まる場所です。

Q:手動なら動くのに、自動実行だと動きません。設定のどこが間違っているのでしょうか。
A:設定が間違っているとは限りません。手で押していたときに人が済ませていた分が、自動実行の側に用意されていない可能性があります。ログインした状態、開いていたフォルダ、読み込まれていた設定、そして許可を押せる位置にいたこと。この4つは押す操作とは別に必要なもので、予約実行では自動的には再現されません。設定画面を細かく見る前に、手で押す前の自分が何をしていたかを書き出してみてはいかがでしょうか。

動かない原因は、設定の外側にある

この記事の答えをまとめます。

手動では動くのに自動実行だと動かないのは、設定の書き方が足りないからではありません。手で押したときに、人がその場にいることで黙って揃えられていたものが、自動実行では揃わないからです。

そして、揃わなくてもエラーは出ません。何も起きないだけです。何も起きない状態は設定の不備のようにも見えるので、多くの人は設定画面のほうを何度も見直すことになります。

やるべきことは、設定をより正確に書くことではありませんでした。人がいる時間のうちに、いない時間の分を先に通しておくことです。そのとき、本番と同じ材料を使う。空で通したものは、通っていません。

いま自動で走らせたい作業を、一つ思い浮かべてみてください。それを手で押すとき、あなたは押す前に、何を済ませているでしょうか。

  • URLをコピーしました!
  • URLをコピーしました!
目次