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

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

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

bash(Bourne-again-Shell)は sh(Bourne Shell)のインプリメンテーションに様々な機能が追加されたシェルです。LinuxやMac OS XではBashはデフォルトで導入されています。

cron

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

Linux

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

Q&A

解決済

5回答

33468閲覧

Linux Cronで複数の引数を渡す方法

ashly

総合スコア119

bash

bash(Bourne-again-Shell)は sh(Bourne Shell)のインプリメンテーションに様々な機能が追加されたシェルです。LinuxやMac OS XではBashはデフォルトで導入されています。

cron

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

Linux

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

0グッド

0クリップ

投稿2016/08/09 03:51

編集2016/08/09 04:58

お世話になります。

LinuxのCronであるBASHスクリプトに引数を渡して定期実行したいと考えています。

bash

1*/1 * * * * /xxx/test.sh `引数1 引数2 引数3` > test.log

このように記載したのですが、test.shでは引数が1つとして認識されてしまいます。

直接実行した場合は問題が無いのですが、回避策などはありますでしょうか。

よろしくお願いします。

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

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

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

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

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

guest

回答5

0

ベストアンサー

引数1 引数2 引数3をまとめてバッククォートで囲っていますが、書き間違いですか?
バッククォートで囲うと、

"引数1" という名前のコマンドを"引数2"と"引数3"を引数として実行して、そのコマンドの出力をtest.shの引数として使う

という意味になりますけど、多分意図通りではないですよね?
「test.shに、引数1,2,3を3つの引数として渡す」というのがしたいことであれば、

*/1 * * * * /xxx/test.sh 引数1 引数2 引数3 > test.log

として下さい。

何故バッククォートで囲いたいと思ったのでしょうか?そのあたりを掘り下げないとまた同じ間違いをします。

投稿2016/08/09 05:30

otn

総合スコア84505

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

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

ashly

2016/08/09 05:39

ありがとうございます。こちらは勘違いしておりました。 確かに意図した動作にはなっていませんでした。 そのため、再度簡単なシェルを以下のようにCRONに記載したところ、無事動くようになりました。 CRON */1 * * * * /xxx/test.sh 引数1 引数2 引数3 > test.log test.shの中身 #!/bin/sh ORG_IFS=$IFS set -u set -e umask 0750 export PATH="/bin:/usr/bin" export LANG="C" cat <<__END__ 指定された引数 $1 $2 $3 __END__ exit 0 そして、再度こちらで用意したシェルに置き換えたところ正常に動作しました。
guest

0

どうしてもだめなときは

clontab

bash

1*/1 * * * * /xxx/test_exec.sh

test_exec.sh

bash

1 /xxx/test.sh 引数1 引数2 引数3 > test.log

投稿2016/08/09 04:19

asahina_dev

総合スコア610

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

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

ashly

2016/08/09 04:53

こちらだと勿論うまくいくのですが、本件はCRONTABに直接引数を記述したい次第です
guest

0

一連の実行部分(/xxx/test.sh 引数1 引数2 引数3)を、シングルまたはダブルクオーテーションで囲ってみてはいかがでしょうか。

投稿2016/08/09 03:56

SSL_beginner01

総合スコア45

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

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

ashly

2016/08/09 04:07

ダブルクオートもしくはシングルクオートで囲った場合、No such file or directoryとなり処理が失敗してしまいます。 */1 * * * * '/xxx/test.sh 引数1 引数2 引数3' > test.log
guest

0

CRONに記述する方法自体がまちがっていました。

正しくはバッククオートなどで囲まず普通に記載することでした。

shell

1*/1 * * * * /xxx/test.sh 引数1 引数2 引数3 > test.log

投稿2016/08/09 05:42

ashly

総合スコア119

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

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

tsunex

2016/08/09 05:59

解決したようでなにより。crontabは久々で勉強になりました。 クオートで囲む場合はこんな例ですかね。 */1 * * * * /xxx/test.sh "あい う" aaa bbb > /xxx/test.log
ashly

2016/08/09 06:31

はい。そもそも今回の場合は括る必要はなかったようです。 また、当初は括らないで実行してたのですがエラーとなったため、何かで括らなければいけないという方向になりハマりました。 記述が合っていたにもかかわらず、エラーとなったのは引数に%などが入っていた為でした。 つまり%を正しくエスケープし、シェルを実行するように普通に記載しておけば悩まずにすんだということだったようです。 tsunexさんも色々アドバイス有り難うございました。
guest

0

crontabの記述は特に問題なさそうに見えます。
実行環境(実行ユーザ)やtest.shの中身が気になります。
簡単なシェルで試すのはどうでしょうか。

bash

1#!/bin/sh 2cat <<__END__ 3指定された引数 4 $1 5 $2 6 $3 7__END__ 8 9exit 0

投稿2016/08/09 04:48

tsunex

総合スコア206

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

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

ashly

2016/08/09 04:56

有り難うございます。 ひとまず、お知らせ頂いたシェルで実行してみましたが以下のようにエラーとなってしまいます。 /bin/sh: /xxx/test.sh 11111 2222222 333333: No such file or directory 実行ユーザーはROOTです。
ashly

2016/08/09 05:01

すみません。 再度ためしてみたところ簡単なシェルではうまくいきました。 よってCRONの記述方法は問題が無いようです。 オリジナルのシェルで違いがあるとすれば、以下のぶぶんなのですが、 これらが追加されることによって実行不可になるのでしょうか。 ORG_IFS=$IFS set -u set -e umask 0750 export PATH="/bin:/usr/bin" export LANG="C"
tsunex

2016/08/09 05:02

念のため crontab -e で編集してますか?内容はこんな感じです。 */1 * * * * /xxx/test.sh aaa bbb ccc > /xxx/test.log
ashly

2016/08/09 05:15

有り難うございます。 Cronは直接VIで編集してサービス再起動をしています。 また、CRONの記述方法は以下のようにしております。 */1 * * * * /xxx/test.sh `aaa bbb ccc` > /xxx/test.log IFSはオリジナルのIFSを保持しておくために記載しているだけですので、 こちらは影響は無いかと思われますが、試しにset -u をコメントアウトすると問題無く実行できるようになりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問