質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.50%
cron

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

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

Q&A

解決済

1回答

4862閲覧

cron経由と直に実行リダイレクトしたスクリプトの標準・標準エラー出力が異なる

minhouse10

総合スコア41

cron

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

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

0グッド

0クリップ

投稿2017/12/19 10:58

編集2017/12/19 18:05

以下のPythonスクリプトを手動でプロンプトから実行しファイルにリダイレクトした場合とcron経由で実行・標準出力及び標準エラー出力をファイルリダイレクトで出力される内容が異なってしまいます。Cron経由の場合出力されないのは、以下1番のケースのみで、関数内に記述されているPrint文となりますが、2番のPrint文は問題なく出力されます。

プロンプトから以下の様に手動実行した場合は両方のPrint文がファイルに出力されます。解決策ご存知の方、どうぞご教授頂ければ幸いです。
python /CR/script_v1.py > /Backup/result.log

1.Cronからリダイレクト時出力されるプリント文:
print('## %s SSH connection failed ##' % h + '\n')

2.Cronからリダイレクト時出力されないプリント文:
print("IP: {0} :({1}):".format(h, c) + '\n')

cron内容

PATH=/root/anaconda3/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:/usr/bin/bash

0,10 * * * * python /CR/script_v1.py > /Backup/result.log 2>&1

#Modules import paramiko from contextlib import suppress from paramiko import SSHException #Variables USER = 'sssr' PSWD = '#pdddddt' #Classes and Functions class InputReader: def __init__(self, commands_path, hosts_path): self.commands_path = commands_path self.hosts_path = hosts_path def read(self): self.commands = self.__readlines(self.commands_path) self.hosts = self.__readlines(self.hosts_path) def __readlines(self, path): with open(path) as f: # return map(lambda v: v.strip(), f.readlines()) return [v.strip() for v in f.readlines()] #List comprehension class CommandExecuter: def __init__(self, host, command): self.host = host self.command = command def execute(self): with suppress(TimeoutError): ssh = paramiko.SSHClient() ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) ssh.connect(self.host, username=USER, password=PSWD) stdin, stdout, stderr = ssh.exec_command(self.command) errors = stderr.readlines() lines = [v.strip() for v in stdout.readlines()] return lines print('## %s SSH connection failed ##' % h + '\n') #Main Procedure if __name__ == '__main__': reader = InputReader("commands2.txt", "systems2.txt") reader.read() for h in reader.hosts: for c in reader.commands: executer = CommandExecuter(h, c) results = executer.execute() print("IP: {0} :({1}):".format(h, c) + '\n') if results != None: for i in results: print(i + '\n')

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

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

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

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

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

guest

回答1

0

自己解決

スクリプトの中に記載している、読み込み用の2つのファイルを絶対パスで指定したところ、問題が解決しました。なぜこれが解決につながったか、いまだに自分の中でロジカルな答えが見つかっていませんが、以降のcron経由での実行では期待した通の出力が得られています。

if name == 'main':
reader = InputReader("/root/CR/commands.txt", "/root/CR/systems.txt")
reader.read()

投稿2017/12/19 14:59

minhouse10

総合スコア41

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

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

minhouse10

2017/12/20 03:20

mkgrei様、上記ページの共有ありがとうございます。Cronでスクリプトを実行するときは絶対パス指定及び明示的なディレクトリ移動が必須なのですね。非常に勉強になりました。改めてありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問