一、crontab运行shell脚本,py脚本 (注意事项)
情景描述:
目前有个sh脚本他最初大致内容是。
cat t11.sh#!/bin/bash
source /etc/profile /bin/python3 /tmp/1.py
sh /tmp/1.sh
echo -e "$(date +%F)" >> /tmp/t11.log############问题是
crontab调用他, 为啥py脚本没执行? 手动 sh t11.sh是正常执行的。
crontab | grep t11 是能看到每次的执行记录的#排查思路:
1、都使用绝对路径 (指令写绝对路径) (shell/py 代码内容,涉及文件的操作) 他默认的pwd是在执行用户的家目录
2、都给x可执行权限
3、开头 source /etc/profile
4、crontab 写查看调试日志,比如 * * * * * sh /tmp/11.sh > /tmp/11.log 2>&1 (最初没考虑到py脚本内容的绝路路径。注意Py脚本里面try catch的书写)5、使用set -x , echo $? , sh -x xxx.sh排查5、创建一个简单的py程序,将hello world 输出到个record.txt
二、bclinux欧拉21.10编译安装nginx1.24.0
yum -y install gcc gcc-c++ pcre pcre-devel openssl openssl-devel zlib zlib-devel
yum install gd-devel -ycd /DATA/apps
mkdir -p tools-nginx-1.24rz -bey #上传nginx-1.24.0.tar.gz (wget https://nginx.org/download/nginx-1.24.0.tar.gz)tar -xf nginx-1.24.0.tar.gz
cd nginx-1.24.0./configure --prefix=/DATA/apps/tools-nginx-1.24 --with-pcre --with-http_ssl_module --with-http_v2_module --with-http_realip_module --with-http_addition_module --with-http_sub_module --with-http_dav_module --with-http_flv_module --with-http_mp4_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_random_index_module --with-http_secure_link_module --with-http_stub_status_module --with-http_auth_request_module --with-http_image_filter_module --with-mail --with-threads --with-mail_ssl_module --with-stream_ssl_modulemake -j 4 && make install #
cd /DATA/apps/tools-nginx-1.24/conf
mkdir -p vhostvi nginx.conf
修改
user root;
worker_processes 8;
#在http{}块里加入include vhost/*.conf; #启动ngx
cd /DATA/apps/tools-nginx-1.24/sbin && ./nginx -t && ./nginx
三、curl指令内容带变量的写法(注意单、双引号,转义符号)
问题描述:最初的curl写法,此时最后的–form 'conditions 里面的 $line是没有被转义的。就算被其旁边的双引号包裹。 发现结果值是空
$line="测试xxx";url=$(curl -s --location --globoff 'http://[xx:1a04]:2040/test/findPage.ilf' \
--header 'Authorization: Bearer eyJxxxxx' \
--form 'tableparam="[{\"name\":\"sEcho\",\"value\":3},{\"name\":\"iColumns\",\"value\":13},{\"name\":\"sColumns\",\"value\":\"\"},{\"name\":\"iDisplayStart\",\"value\":0},{\"name\":\"iDisplayLength\",\"value\":50},{\"name\":\"mDataProp_0\",\"value\":\"taskId\"},{\"name\":\"mDataProp_1\",\"value\":\"taskId\"},{\"name\":\"mDataProp_2\",\"value\":\"taskId\"},{\"name\":\"mDataProp_3\",\"value\":\"taskName\"},{\"name\":\"mDataProp_4\",\"value\":\"taskType\"},{\"name\":\"mDataProp_5\",\"value\":\"cronTab\"},{\"name\":\"mDataProp_6\",\"value\":\"inUse\"},{\"name\":\"mDataProp_7\",\"value\":\"ifFailRestart\"},{\"name\":\"mDataProp_8\",\"value\":\"ifFailRestartDelay\"},{\"name\":\"mDataProp_9\",\"value\":\"isSendAlarm\"},{\"name\":\"mDataProp_10\",\"value\":\"systemInternalId\"},{\"name\":\"mDataProp_11\",\"value\":\"taskIdMeta\"},{\"name\":\"mDataProp_12\",\"value\":\"taskGroupName\"}]"' \
--form 'conditions="[{\"name\":\"taskName\",\"value\":\"$line\"}]"')
#最初的写法:
--form 'conditions="[{\"name\":\"taskName\",\"value\":\"$line\"}]"'#错误的写法1 (会出现报错的写法)
--form \"conditions="[{\"name\":\"taskName\",\"value\":\"${line}}]\"\" #错误的写法2 (去掉转义符号。)
--form 'conditions="[{"name":"taskName","value":'"$line"'}]"'
#不能把它的转义号给去掉,否则报错:
+ ret='{"timestamp":"2024-03-08T03:40:49.502+0000","status":500,"error":"Internal Server Error","message":"Found starting '\''['\'' but missing '\'']'\'' at the end. at character 0 of null","path":"/xxx/findPage.ilf"}'
#正确的写法:--form 'conditions="[{\"name\":\"taskName\",\"value\":\"'"$line"'\"}]"'
#参考 年薪28大佬
你都用单引号了,为什么还要把双引号转义。 <font color=red> 外面单引号的话,内部变量就用单引号加双引号'aaa'"$arg"'' </font>
你上面那些没有必要的转义去掉,单引号里面不需要再转义了。
(但其实上面的话有对有错。 但是在这里使用 \x22 \x27没有效果的。还有有次调试过程出现两个 form conditions=)
再再再谈单双引号:
#by malongshuai
bash的引号是从前向后逐一寻找配对,所以""$a""完全等价于哆勒a,他左边一对引号配对了,说明没有引号包围哆勒a
只有一种情况是从左到右逐一配对的例外,遇到命令替换的时候
命令替换是独立的新bash进程,先于引号解析移除的阶段,所以命令替换里的命令先被解析执行,所以命令替换外的双引号不会和命令替换里的双引号配对,命令替换里的引号也不影响命令替换外的引号#后知后觉的参考:
https://stackoverflow.com/questions/13341955/how-to-pass-a-variable-in-a-curl-command-in-shell-scripting
https://www.cnblogs.com/XY-Heruo/p/16310409.html
https://blog.csdn.net/weixin_42808782/article/details/125296518 《如何在 shell 脚本中的 curl 命令中传递变量》