【问题标题】:sh script does not work from crontabsh 脚本在 crontab 中不起作用
【发布时间】:2018-02-03 11:09:34
【问题描述】:

我有一个 Debian 服务器和

我需要一个调用 sql-script 的 sh 脚本

为了从 MySQL 表中获取一些数据

所以我通过 ssh 以 root 身份连接到我的服务器并创建了所有文件

请注意,我使用了脚本中所有文件的完整路径

为了避免误解。

/root/bin/mgbc.sh

#!/bin/sh

(echo "SET @cid=570; SET @cid2='service@';" ; cat /root/bin/mgbc.sql) |/full-path-to/mysql -uusername -pservetword  > /root/bin/result_mgbc.txt 

/root/bin/mgbc.sql

SELECT  table1.id, table1.a_id, table2.email
FROM table1
INNER JOIN table2 ON table1.a_id=table2.id
AND table1.campaign_id = @cid
AND table2.email LIKE CONCAT('%', @cid2 ,'%')
; 

让我们运行它

*/root/bin/mgbc.sh*

*/root/bin/result_mgbc.txt* 我看到了

*table1.idtable1.a_idtable2.email*

还有很多行

然后我决定把它作为一个crontab任务

所以我进入了

crontab -e

并添加了一行

35 10 1 * * /root/bin/mgbc.sh 

我从 crontab 日志文件中看到脚本已启动, 但在*/root/bin/result_mgbc.txt* 我只看到字段列表

table1.id, table1.a_id, table2.email

而且根本没有数据。

看起来 @cid@cid2 参数在某处丢失了 当 crontab 运行脚本时。

谁能告诉我发生了什么以及如何解决这个问题?

提前致谢。

【问题讨论】:

  • 我怀疑回显命令字符串确实会执行它们。对此进行调查。
  • 是的,看起来像这样。由于我的想法是从 sh 脚本中排除任何参数,然后将其作为 /root/bin/mgbc.sh 570 'service@' 运行,我认为最好忘记它:-)
  • 70+ Q/A 在这里搜索[linux] does not work from crontab。祝你好运。

标签: mysql sql debian sh


【解决方案1】:

将您的 SET 语句添加到 mgbc.sql 并像这样运行它

/full-path-to/mysql -uusername -pservetword < /root/bin/mgbc.sql > /root/bin/result_mgbc.txt

/full-path-to/mysql -uusername -pservetword -e "SET @cid=570; SET @cid2='service@';" -e "$(cat /root/bin/mgbc.sql)" > /root/bin/result_mgbc.txt

或者您可以根据输入参数动态构建 sql 文件。

不确定这是否可行

/full-path-to/mysql -uusername -pservetword -e "SET @cid=570; SET @cid2='service@';" < /root/bin/mgbc.sql > /root/bin/result_mgbc.txt

【讨论】:

  • 这行得通,我以前试过,但我确实需要在我的 sh 中设置,以便将来像 /root/bin/mgbc.sh parameter1 parameter2 一样运行它。得到不知道为什么通过 crontab 这不会飞。
  • 添加了更多选项,看看它们是否更适合您。
  • 谢谢你的例子` /full-path-to/mysql -uusername -pservetword -e "SET @cid=570; SET @cid2='service@';" -e "$(cat /root/bin/mgbc.sql)" > /root/bin/result_mgbc.txt ` 从命令行可以正常工作,但不能在 crontab 中工作。
  • 这很奇怪。 crontab 有什么问题。粘贴错误(如果有)。
  • 我希望我能看到任何错误。但是没有错误。我想知道你是否有机会在你身边尝试同样的方法:-)。我确定有一件事-在我的情况下,SET 参数不会出现在 mysql 中。因此,我需要使用 SET 包含几个 sql-scrit,然后在 crontab 中使用它。
【解决方案2】:

我终于找到了解决办法。 瓶颈是“%”

为了让一切正常工作,我需要这样做:

/root/bin/mgbc.sh

#!/bin/sh

(/bin/echo "SET @cid=570; SET @cid2='something@';" ; cat /root/bin/mgbc.sql) | /usr/bin/mysql -uusername -pservetword  > /root/bin/result_mgbc.txt

SQL 脚本

SET @percent := '%' ;

SELECT  table1.id, table1.a_id, table2.email
FROM table1
INNER JOIN table2 ON table1.a_id=table2.id
AND table1.campaign_id = @cid
AND table2.email LIKE CONCAT(@percent, @cid2 , @percent)
;

SET @percent := '%' 已修复问题,

因为 crontab 不能使用百分号。

感谢大家的帮助!

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-12
  • 2012-08-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多