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

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

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

HubotはGitHub社が開発したチャットbotのフレームワークです。

CoffeeScript

CoffeeScriptはプログラミング言語です。シンタックスシュガーの導入により、JavaScriptのコードに変換された後動作します。JavaScriptに比べ、可読性と簡潔性が向上しています。

sh

shは、UNIX系OSのシェル操作の1つであり、最も基本的なシェルのことです。

Slack

Slackは、Tiny Speckという企業からリリースされたコミュニケーションツールです。GoogleDriveやGitHubなど、さまざまな外部サービスと連携することができます。

Q&A

解決済

2回答

5018閲覧

hubotでscriptをcronでまわすには・・?

twin_bird

総合スコア230

Hubot

HubotはGitHub社が開発したチャットbotのフレームワークです。

CoffeeScript

CoffeeScriptはプログラミング言語です。シンタックスシュガーの導入により、JavaScriptのコードに変換された後動作します。JavaScriptに比べ、可読性と簡潔性が向上しています。

sh

shは、UNIX系OSのシェル操作の1つであり、最も基本的なシェルのことです。

Slack

Slackは、Tiny Speckという企業からリリースされたコミュニケーションツールです。GoogleDriveやGitHubなど、さまざまな外部サービスと連携することができます。

0グッド

0クリップ

投稿2016/08/27 19:52

編集2016/08/28 18:55

hubot(slack)でcronをまわして定期的にslackの任意のチャンネルにshellの出力結果を吐き出したいのですが、coffee scriptの書き方が今ひとつわかりません。

module.exports = (robot) -> cronJob = new cronJob('*/10 * * * *', () -> envelope = room: "general" @exec = require('child_process').exec command = "/hoge_hubot/scripts/shell/hoge.sh" msg.send "Command: #{command}" @exec command, (error, stdout, stderr) -> msg.send error if error? msg.send stdout if stdout? msg.send stderr if stderr? ) cronJob.start()

こんな感じでかいたみたのですが、実行されていないようでどこか間違っているような気がします。
アドバイスお願い致します。。

追記: coffee scriptを書き換えてみました。

cron = require('cron').CronJob module.exports = (robot) -> new cron '*/1 * * * *', () => @exec = require('child_process').exec command = "/hoge_hubot/scripts/shell/hoge.sh" @exec command, (error, stdout, stderr) -> robot.send {room: "#general"}, "stdout" , null, true, "Asia/Tokyo"

これでshellの実行結果がslackに投稿されれば良いのですが、stdoutの部分が展開されず、文字列として表示されてしまいます。。。
(error,stdout,stderr)の部分がどういうものなのか理解しきれていないのですが、以下のようなコードの場合は動作するので、参考にしてみたもののも上手くいきません_| ̄|○

module.exports = (robot) -> robot.respond /artisan_up/, (msg) -> @exec = require('child_process').exec command = "/hoge_hubot/scripts/shell/hoge.sh" msg.send "Command: #{command}" @exec command, (error, stdout, stderr) -> msg.send error if error? msg.send stdout if stdout? msg.send stderr if stderr?

追記2:shell(hoge.sh)については以下のとおりです。

logwatch --print

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

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

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

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

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

guest

回答2

0

自己解決

cron = require('cron').CronJob module.exports = (robot) -> new cron '*/1 * * * *', () => @exec = require('child_process').exec command = "/webyone_hubot/scripts/shell/logwatch.sh" @exec command, (error, stdout, stderr) -> robot.send {room: "#general"}, stdout , null, true, "Asia/Tokyo"

これで動きましたw
このコードが動くのではないかと最初踏んでいたのですが、なぜか動かず、その後試行錯誤して改めてこのコードを試してみると動きましたw
どこが原因だったか判明していませんが、これでクローズします。
コメント頂けた方、ありがとうございました!!

投稿2016/08/29 05:37

twin_bird

総合スコア230

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

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

0

cronJob 自体についてはわかりませんが、CoffeeScript としておかしなところを指摘してみます。

coffee

1cronJob = new cronJob('*/10 * * * *', () ->

変数の cronJob とクラス名の cronJob が被ってしまっています。そもそも cronJob クラスがどこから来たのか提示されたコードからだとよくわからないのですが、事前に読まれていたとしても上書きされてしまうのはまずい気がします。

coffee

1cronJob.start()

この cronJob がクラスなのか 2 行目で作った変数なのかがわからないのですが、もし変数のつもりであるなら、2 行目で宣言された cronJob 変数は (robot) -> 関数内のローカル変数ですので、この位置からは参照できません。

そしておまけですが、@exec@ は恐らく必要ないです。あっても動作に支障はないかとは思います。

投稿2016/08/28 14:52

thinca

総合スコア1864

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

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

twin_bird

2016/08/28 18:48

回答ありがとうございます!もう少しシンプルな形に変更してみたのですが、変数?部分の展開が上手くいきません。。(質問欄参照)
thinca

2016/08/29 02:11

`"stdout"` のようにクォートで囲えば当然 `stdout` と言う文字列そのものが送られます。変数 `stdout` を指定してみてください。
twin_bird

2016/08/29 04:56

バックティック(`)で指定してみましたが、展開されないようです。。hubotはpm2でデーモンを永続化しているので、そちらのログを確認してみましたがそれらしきエラー等見当たりませんでした。。
thinca

2016/08/29 05:00

すいません。バックティックは Markdown の記法のつもりで書きました(そしてコメントでは Markdown は使えませんでした…)。 いずれにしても基本的な CoffeeScript の文法部分になるので、わからない場合は基礎の入門からやり直したほうが良いかと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.37%

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

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

質問する

関連した質問