🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
cron

cronは、Unix系OS上でデーモンプロセスとして動作する、スクリプトの自動実行が可能なジョブスケジューラです。

zsh

zshは、UNIX系OSのシェルの1つです。 cshやksn系のコマンドライン編集機能も実装されたシェルです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

3回答

4881閲覧

macでcronを動かしたいが、なにをやっても動かない

TK_T

総合スコア6

cron

cronは、Unix系OS上でデーモンプロセスとして動作する、スクリプトの自動実行が可能なジョブスケジューラです。

zsh

zshは、UNIX系OSのシェルの1つです。 cshやksn系のコマンドライン編集機能も実装されたシェルです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2021/03/11 10:06

macでcronを動かしたいのですが
crontab -l で確認すると

*/1 * * * * /Users/XXXXX/.pyenv/shims/python ~/python/test.py

と入っているのですが、動かず。

test.pyには

print("hello")

とのみ記載しています。

ターミナルを開くたびにmailが来るので内容を見ると

X-Original-To: XXXXX Delivered-To: XXXXX@XXXXX.local From: XXXXX@XXXXX.local (Cron Daemon) To: XXXXX@XXXXX.local Subject: Cron <XXXXX@XXXXX> ~/python/test.py X-Cron-Env: <SHELL=/bin/sh> X-Cron-Env: <PATH=/usr/bin:/bin> X-Cron-Env: <LOGNAME=XXXXX> X-Cron-Env: <USER=XXXXX> Date: Thu, 11 Mar 2021 17:58:01 +0900 (JST) /Users/XXXXX/python/test.py: line 1: syntax error near unexpected token `"hello"' /Users/XXXXX/python/test.py: line 1: `print("hello")'

色々調べたのですが、理由が分からず、、、どなたか教えて下さい。
個人情報部分だけXXXXXとしています。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

otn

2021/03/11 10:39

端末から、 /Users/XXXXX/.pyenv/shims/python ~/python/test.py と打って動きますか?
TK_T

2021/03/11 10:40

はい、動きます。正常にターミナルに hello を出力されます。
TakaiY

2021/03/11 11:26

このメールは、呼び出したコマンドが出力した内容を通知するものです。内容はエラーメッセージです。 そして、このエラーメッセージは、このtest.py が pythonでなくてshell(bashやzsh)で実行されていることを示しています。 crontab のエントリをもう一度確認してください。
takasima20

2021/03/11 11:49

「動いた」と判断するのはどういう状況を想定されていますか? もしかして、画面上にターミナルが自動的に開いて表示されると思ってらっしゃいますか?
TK_T

2021/03/12 02:03

printで質問したのでわかりにくかったのかもしれません。申し訳ございません。 test.pyの内容を ``` from selenium import webdriver driver = webdriver.Chrome() driver.get('https:google.com') ``` に変更したのですが、やはり ``` X-Cron-Env: <SHELL=/bin/sh> X-Cron-Env: <PATH=/usr/bin:/bin> X-Cron-Env: <LOGNAME= XXXXX > X-Cron-Env: <USER= XXXXX > Date: Fri, 12 Mar 2021 10:59:00 +0900 (JST) from: can't read /var/mail/selenium /Users/XXXXX/python/test.py: line 2: syntax error near unexpected token `(' /Users/XXXXX/python/test.py: line 2: `driver = webdriver.Chrome()' ``` というmailが届き、実行されません。なぜでしょうか・・・。
int32_t

2021/03/12 02:13

質問文に書かれている crontab -l の結果は本当に現在のものでしょうか? メールのSubjectと本文からすると、違うのではないかと思えます。
TK_T

2021/03/14 05:31

crontab -l で表示されるのは */1 * * * * /Users/takuya/.pyenv/shims/python ~/python/test.py です。
guest

回答3

0

ベストアンサー

*/1 * * * * /Users/XXXXX/.pyenv/shims/python ~/python/test.py

最後の*の後(/Usersの直前)の空白が**全角空白(U+3000)**ですが、実際の内容でも全角空白になっているか、確認してください。

実際に全角空白になっている場合、全角空白はcrontabのトークンの区切りにならないため、* /Users/XXXXX/.pyenv/shims/pythonまでが一つのトークンとして扱われ、~/python/test.pyが実行するコマンドとして解釈されて、シェルが実行してエラーになっているのではないかと思われます。

投稿2021/03/12 02:45

編集2021/03/12 02:47
Daregada

総合スコア11990

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

TK_T

2021/03/13 11:21

おっしゃるとおり、最後の*の後(/Usersの直前)の空白が全角空白(U+3000)でしたので、半角に修正致しました。 エラーが出てしまい、内容は下記です。 Subject: Cron <XXXX> /Users/XXXX/.pyenv/shims/python ~/python/test.py X-Cron-Env: <SHELL=/bin/sh> X-Cron-Env: <PATH=/usr/bin:/bin> X-Cron-Env: <LOGNAME=XXXX> X-Cron-Env: <USER=XXXX> Date: Sat, 13 Mar 2021 20:20:01 +0900 (JST) Traceback (most recent call last): File "/Users/XXXX/.pyenv/versions/3.9.1/lib/python3.9/site-packages/selenium/webdriver/common/service.py", line 72, in start self.process = subprocess.Popen(cmd, env=self.env, File "/Users/XXXX/.pyenv/versions/3.9.1/lib/python3.9/subprocess.py", line 947, in __init__ self._execute_child(args, executable, preexec_fn, close_fds, File "/Users/XXXX/.pyenv/versions/3.9.1/lib/python3.9/subprocess.py", line 1819, in _execute_child ``` test.pyの内容は下記です ``` from selenium import webdriver driver = webdriver.Chrome() driver.get('https:google.com') ```
Daregada

2021/03/13 13:07 編集

エラー内容が明確に変わって、pythonが実行されるようになりましたね。 実行するコードを「print("hello")」だけのものに差し替えて、cronで実行されるか確かめてください。
Daregada

2021/03/13 13:17

helloを出力するコードが動いたら、その後でseleniumを動かすコードに差し替えればいい。 必ず、オプション引数executable_pathにchromedriverのフルパスを設定してください。
TK_T

2021/03/14 05:37

ありがとうございます。 test.pyの内容を print("hello") のみにしましたが、これが上手く動いているのかはどのように確認すればよろしいでしょうか? ターミナルにhelloを表示されるわけでもないので、確認方法が分からずでして・・・
Daregada

2021/03/14 05:49

ファイルにリダイレクトせずに標準出力に出力した内容はメールで送られてきます。別の方の回答に書いてありますよ。
TK_T

2021/03/15 10:23

ありがとうございます。 メールを確認すると無事にhelloとのみ書かれたメールが届いておりました。 やはり原因は全角空白だったみたいです。 そこでtest.pyの内容を from selenium import webdriver driver = webdriver.Chrome(executable_path="/usr/local/bin/chromedriver/chromedriver") driver.get('https:google.com') とすると無事に動きました。 しかし、通常自分で起動するときは from selenium import webdriver driver = webdriver.Chrome() driver.get('https:google.com') とパスは記載しておりません。このままですとcron設定をするたびにパスの記載をする必要がありそうなのですが、何かいい方法はございますでしょうか。。。
Daregada

2021/03/15 10:41

cronで動かすときのPATHの設定は、ターミナルのPATHの設定とは独立しています。 crontabに「PATH=」という形式で指定できます。 メールの内容からして、現在は「PATH=/usr/bin:/bin」になっているはずです。 「PATH=/usr/bin:/bin:/usr/local/bin/chromedriver」とでもすれば、webdriver.Chrome()の引数を指定しないでもchromedriverを見つけてくれるのでは。
Daregada

2021/03/15 10:43

さて、疑問点が解消されたのであれば、この質問を「解決済」にしてください。 また、あなたが参考になった回答(私のに限らず)には「高評価」を付けてください。
TK_T

2021/03/15 11:05

test.pyの内容を from selenium import webdriver driver = webdriver.Chrome() driver.get('https:google.com') から from selenium import webdriver from webdriver_manager.chrome import ChromeDriverManager driver = webdriver.Chrome(ChromeDriverManager().install()) driver.get('https:google.com') に変更すれば無事に動きましたので報告致します!
TK_T

2021/03/15 11:11

また、ご指摘の PATH=/usr/bin:/bin:/usr/local/bin/chromedriver */1 * * * * /Users/takuya/.pyenv/shims/python ~/python/test.py とすることでも動きました。ありがとうございました。
guest

0

あなたのGoogle Chromeのバージョンにあったchromedriverのバイナリファイルを
ダウンロード、インストールして引数に指定してみてはいかがでしょう?

<test.py>
driver = webdriver.Chrome(executable_path='/インストールパス/chromedriver')

投稿2021/03/13 13:04

technocore

総合スコア7337

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

TK_T

2021/03/13 13:09

ターミナルに直接 python ~/python/test.py と打つと起動できるのでchromedriverのバージョンは問題ないかと考えております。
technocore

2021/03/13 13:13

そうですか。 私のMacではバイナリファイルを指定する方法で、crontabでChromeを動かしていますので これが原因と考えました。
Daregada

2021/03/13 13:30

cronで実行する際は、PATHの設定がターミナルで実行する際のPATHと異なるため、chromedriverを見つけられなくてエラーになる可能性は十分に考えられます。
technocore

2021/03/13 13:34

わたしのMacではcrontab+selenium+chromeで以前より問題なくクローリングできています。 アドバイスありがとうございます。
TK_T

2021/03/14 05:32

>cronで実行する際は、PATHの設定がターミナルで実行する際のPATHと異なるため、chromedriverを見つけられなくてエラーになる可能性は十分に考えられます。 これはどのように変更すればよいのでしょうか?
guest

0

質問を書いていて気付きました。

cronで起動したコマンドの標準出力/標準エラー出力はメールで通知されます。 cronの仕様ですが、出力先がないからです。
もしかして、メールの中に「hello」とだけ書かれたものがありませんか? それが動作したときの結果です。

そして、「なにをやっても」の中に、cronのエントリを

text

1*/1 * * * * ~/python/test.py

のようにしたこともあるのではありませんか?

メールはそのときのものでしょう。

投稿2021/03/11 11:33

TakaiY

総合スコア13748

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

TK_T

2021/03/12 02:07

ご回答ありがとうございます。上記のエラーメールが指定時間ごとに送られてくるのみで、「hello」とだけ書かれたものはございません。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問