一、问题描述

.net 网关程序需要设置定时重启,按照日常操作先把正在运行的 PID kill 掉后,再执行启动服务。

把脚本放到 crontab 计划任务上,可以把服务 PID kill 掉,但无法启动服务,直接手动运行脚本是可以成功启动的。

.net 服务重启脚本test1.sh 如下:

[root@localhost ~]# cat test1.sh
#!/bin/bash ID=`ps -ef | grep YTGateWayServiceZZ| grep -v "grep" | awk '{print $2}'`
for id in $ID;
do
kill -9 $id
done sleep 3;
nohup dotnet /home/gateway1/YTGateWayServiceZZ.dll > /dev/null 2>&1 &

通过脚本无法启动,试着把 .net 程序写成服务后,发现是可以正常重启的。

二、将 .net 程序写成服务

先把原来通过执行路径方式启动的服务 kill 掉之后,再执行 config.sh 脚本把程序写成服务;

并写入 crontab 计划任务中,通过测试是可以正常重启程序。

[root@localhost ~]# cat config.sh
#!/bin/bash # 找到 dotnet 命令位置
dotnet=`which dotnet` # 将 .net core 写成服务方式运行
cat > /usr/lib/systemd/system/gateway1.service << EOF
[Unit]
# 服务描述
Description=gateway1 YTGateWayServiceZZ [Service]
# 程序工作路径
WorkingDirectory=/home/gateway1
# 启动程序路径
ExecStart= $dotnet /home/gateway1/YTGateWayServiceZZ.dll
Restart=always
# 如果 dotnet 服务崩溃,10秒后重新启动服务
RestartSec=10 [Install]
# 系统运行级别
WantedBy=multi-user.target
EOF # 写入 crontab 计划任务(6个小时重启一次)
crontab -l > conf && echo "0 */6 * * * systemctl restart gateway1.service " >> conf && crontab conf && rm -f conf

执行脚本 config.sh

[root@localhost ~]# chmod +x config.sh
[root@localhost ~]# ./config.sh

管理自定义服务命令

# systemctl status gateway1.service
# systemctl start gateway1.service
# systemctl restart gateway1.service
# systemctl enable gateway1.service

三、通过 crontab 执行脚本无法启动原因

通过将 .net 程序写成服务测试之后,初步判断很有可能是 crontab 执行时没有找到系统环境变量导致的。

检查了脚本发现只有 dotnet 命令没有使用绝对路径,试着把 dotnet 命令加上绝对路径结果可以成功启动了。

[root@localhost ~]# which dotnet
/usr/local/bin/dotnet
[root@localhost ~]# cat test1.sh
#!/bin/bash ID=`ps -ef | grep YTGateWayService| grep -v "grep" | awk '{print $2}'`
for id in $ID;
do
kill -9 $id
done sleep 3;
nohup /usr/local/bin/dotnet /root/publish/YTGateWayService.dll > /dev/null 2>&1 &

.net 程序通过 crontab 无法启动,手动执行脚本可以启动的更多相关文章

  1. crontab 定时执行脚本出错,但手动执行脚本正常

    原因: crontab 没有去读环境变量,需要再脚本中手动引入环境变量,可以用source 也可以用export 写死环境变量. 为了定时监控Linux系统CPU.内存.负载的使用情况,写了个Shel ...

  2. Linux开机启动时执行脚本的方法

    方法 1 – 使用 rc.local利用 /etc/ 中的 rc.local 文件在启动时执行脚本与命令.我们在文件中加上一行来执行脚本,这样每次启动系统时,都会执行该脚本.不过我们首先需要为 /et ...

  3. crontab执行脚本和手动执行脚本输出结果不一致的问题处理

    背景:huskiesir最近用公司给分配的账户写了脚本去检测某应用状态并发送到企业邮箱,写完脚本之后去执行了一下,发现效果还不错,在邮箱显示效果如下: 10.11.116.6  检查结果OK,检查时间 ...

  4. 小记---------手动执行脚本正常执行,使用crontab定时执行时 不执行

    可能出现的原因就是因为crontab不会从用户的/etc/profile文件中读取环境变量,所以就出现 使用定时crontab执行时 无法执行 抛错 所以在使用crontab 定时执行脚本时  在脚本 ...

  5. jmeter之非GUI启动与执行脚本

    启动jmeter的图形界面可以从dos窗口输命令启动:图形界面还是比较占资源的,这时候可以通过dos窗口来执行脚本,获取性能结果 目录 1.dos窗口启动jmeter图形界面 2.dos窗口执行脚本, ...

  6. crontab的定时任务不能自动执行,但是手动执行脚本一直能成功

    crontab 问题小记: 环境变量问题, 养成良好的习惯, 在脚本开头export PATH 原因是 crontab 执行定时任务时,用的不是系统环境变量,而是自己的环境变量,可以把 echo $P ...

  7. 手动执行脚本可以运行,crontab自动执行无效的解决方法

    在需要执行的脚本里加入环境变量即可,如下图:

  8. docker容器启动时执行脚本 run /bin/bash执行多条指令

    搜了很多资料发现并未解决,以下方法失败!求大神评论给出完美方案 1.首先需要编写需要启动的脚本,并将脚本放在 /etc/init.d/目录下 如:cs.sh 2.修改权限 3.chkconfig -- ...

  9. java 调用启动远程shell脚本,启动spark

    1 依赖 <!--远程调用shell--> <dependency> <groupId>ch.ethz.ganymed</groupId> <ar ...

随机推荐

  1. [FJ2021]D2T3题解

    考试的时候一点思路没有,最近听福州的神仙的一些做法. 想自己推一下. 题目大概是这样的 \(a_i = \frac{i\ *\ a_{i - 1} \ + \ i\ * \ (i\ -\ 1)\ * ...

  2. Python中关于join函数的陷阱?

    目录 说明 数据说明 正确示例 错误示例 解决办法 说明 最近在用Python的join函数连接多个列表时,出现了如下两个错误,即合并类型不一致.折腾了很久才找到原因,真是基础不牢,地动山摇. Typ ...

  3. Augustus 进行基因注释

      目前的从头预测软件大多是基于HMM(隐马尔科夫链)和贝叶斯理论,通过已有物种的注释信息对软件进行训练,从训练结果中去推断一段基因序列中可能的结构,在这方面做的最好的工具是AUGUSTUS它可以仅使 ...

  4. 完美png图片添加水印类

    完美png图片添加水印类 被添加水印图片和水印图片都可以是png,保证透明无色背景,可调节透明度 <?phpclass Imgshuiyin{ /* 缩略图相关常量定义 */ const THU ...

  5. C#最大值

    dtToSList = sqlAccess.ExecuteTable(CommandText); ToSNo = Convert.ToString(dtToSList.Rows[i].ItemArra ...

  6. eclipse上点击open Perspective找不到java EE的解决办法

    原因:没有安装java ee等插件 Help--->Install New software---->work  with中选择All Available  Sites---->  ...

  7. ABA 问题

    CAS 导致 ABA 问题CAS 算法实现了一个重要的前提,需要取出内存中某时刻的数据,并在当下时刻比较并替换,那么这个时间差会导致数据的变化. 比如说一个线程 one 从内存位置 V 中取出A,这时 ...

  8. Vue相关,vue.nextTick

    vue中有一个较为特殊的API,nextTick.根据官方文档的解释,它可以在DOM更新完毕之后执行一个回调,用法如下: // 修改数据 vm.msg = 'Hello' // DOM 还没有更新 V ...

  9. [转] Java中对数据进行加密的几种方法

    加密算法有很多种:这里只大约列举几例: 1:消息摘要:(数字指纹):既对一个任意长度的一个数据块进行计算,产生一个唯一指纹.MD5/SHA1发送给其他人你的信息和摘要,其他人用相同的加密方法得到摘要, ...

  10. @NotBlank 注解不生效

    1. @NotBlank 注解是用来校验 String 类型的参数是否为空的 2. 使用方法 (1)Spring-boot 某一个版本之前 spring-boot-starter-web 中有包含 h ...