搜索
bottom↓
回复: 47

请教Linux上应用程序自启动的问题,谢谢。

[复制链接]

出0入36汤圆

发表于 2020-4-11 18:32:35 | 显示全部楼层 |阅读模式
本帖最后由 redworlf007 于 2020-4-11 18:36 编辑

1、在Linux,有个串口通讯的程序,串口给读卡器发一次指令读卡器应答有没有卡片,并且把收到的串口应答打印在串口控制台,应用程序名:nuc980_jyz。
2、在串口控制台,命令行输入:./nuc980_jyz &,这样可以正常运行。
3、在Linux启动脚本rcS里面,添加:./nuc980_jyz &,重启后就报错,应用程序在根目录。
4、请教大家,这个啥原因啊。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

阿莫论坛20周年了!感谢大家的支持与爱护!!

月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!

出10入61汤圆

发表于 2020-4-11 18:36:57 | 显示全部楼层
启动脚本里写绝对路径

出615入1076汤圆

发表于 2020-4-11 19:55:20 来自手机 | 显示全部楼层
本帖最后由 dukelec 于 2020-4-11 19:57 编辑

啟動的太靠前,節點還沒建立?

另外,切後台可以考慮用 nohup,或者 screen 工具

出0入36汤圆

 楼主| 发表于 2020-4-11 20:11:08 来自手机 | 显示全部楼层
tcm123 发表于 2020-4-11 18:36
启动脚本里写绝对路径

文件在根目录下,这个应该是绝对路径了吧。

出0入36汤圆

 楼主| 发表于 2020-4-11 21:25:46 来自手机 | 显示全部楼层
dukelec 发表于 2020-4-11 19:55
啟動的太靠前,節點還沒建立?

另外,切後台可以考慮用 nohup,或者 screen 工具 ...

在启动脚本里面./nuc980_jyz 这么写,不加&,应用程序也能正常启动,加上&应用程序启动就报错……

出0入17汤圆

发表于 2020-4-11 22:00:00 | 显示全部楼层
应该是fd指向的对象在脚本运行是还没有建立,基本上是串口驱动还没有加载。
没有用&可以的原因是在前台运行nuc980_jyz,程序应该会阻塞等待打开fd,而加了&会后台运行nuc980_jyz,程序在后台打开fd失败则会直接退出。
以上纯属猜测。

出0入0汤圆

发表于 2020-4-11 22:08:16 | 显示全部楼层
redworlf007 发表于 2020-4-11 21:25
在启动脚本里面./nuc980_jyz 这么写,不加&,应用程序也能正常启动,加上&应用程序启动就报错…… ...

不要前面那个 ".'"    直接 /app &   

出0入36汤圆

 楼主| 发表于 2020-4-11 22:14:45 来自手机 | 显示全部楼层
浮华一生 发表于 2020-4-11 22:08
不要前面那个 ".'"    直接 /app &

不行,试了。

出0入36汤圆

 楼主| 发表于 2020-4-11 22:15:15 来自手机 | 显示全部楼层
Nuker 发表于 2020-4-11 22:00
应该是fd指向的对象在脚本运行是还没有建立,基本上是串口驱动还没有加载。
没有用&可以的原因是在前台运行 ...

我再检查下代码看看。

出0入0汤圆

发表于 2020-4-11 22:19:51 | 显示全部楼层

不介意把你的 rcS脚本发上来看看

出0入36汤圆

 楼主| 发表于 2020-4-11 22:46:52 来自手机 | 显示全部楼层
浮华一生 发表于 2020-4-11 22:19
不介意把你的 rcS脚本发上来看看

明天我发,这会从公司回来了。

出0入0汤圆

发表于 2020-4-12 00:07:58 | 显示全部楼层
本帖最后由 slzm40 于 2020-4-12 00:09 编辑
redworlf007 发表于 2020-4-11 22:46
明天我发,这会从公司回来了。


节点未建立,
在之前要先执行/sbin/mdev -s 命令执行动态加载节点.
如果高级点的,可能是udev

出0入36汤圆

 楼主| 发表于 2020-4-12 00:09:02 | 显示全部楼层
Nuker 发表于 2020-4-11 22:00
应该是fd指向的对象在脚本运行是还没有建立,基本上是串口驱动还没有加载。
没有用&可以的原因是在前台运行 ...

你说的对,我刚才又打印了下,加&,后台运行的时候:fd = UART0_Open(fd, "/dev/ttyS1"); //打开串口,返回文件描述符 这个fd返回-1,没有打开成功,手动运行这个会返回成功,这个怎么治疗?请教

出0入36汤圆

 楼主| 发表于 2020-4-12 00:12:47 | 显示全部楼层
slzm40 发表于 2020-4-12 00:07
节点未建立,
在之前要先执行/sbin/mdev -s 命令执行动态加载节点.
如果高级点的,可能是udev ...

我去看看。。。

出0入0汤圆

发表于 2020-4-12 00:26:25 | 显示全部楼层
sleep 10        

出0入36汤圆

 楼主| 发表于 2020-4-12 00:36:31 | 显示全部楼层
浮华一生 发表于 2020-4-11 22:19
不介意把你的 rcS脚本发上来看看

你看看

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2020-4-12 00:41:04 | 显示全部楼层


mdev命令在bin目录下?? 我的怎么在sbin下
我这个rcS和你差不多
如果不行,建议sleep1秒

  1. #!/bin/sh


  2. PATH=/sbin:/bin:/usr/sbin:/usr/bin
  3. runlevel=S
  4. prevlevel=N
  5. umask 022
  6. export PATH runlevel prevlevel

  7. #
  8. #        Trap CTRL-C &c only in this shell so we can interrupt subprocesses.
  9. #

  10. hostname -F /etc/sysconfig/HOSTNAME

  11. mount -n -t proc none /proc
  12. mount -n -t sysfs none /sys
  13. mount -t ramfs none /dev

  14. echo /sbin/mdev > /proc/sys/kernel/hotplug
  15. /sbin/mdev -s
  16. # mounting file system specified in /etc/fstab
  17. mkdir -p /dev/pts
  18. mkdir -p /dev/shm
  19. mount -n -t devpts none /dev/pts -o mode=0622
  20. mount -n -t tmpfs tmpfs /dev/shm
  21. mount -n -t ramfs none /tmp
  22. mount -n -t ramfs none /var
  23. mkdir -p /var/empty
  24. mkdir -p /var/log
  25. mkdir -p /var/lock
  26. mkdir -p /var/run
  27. mkdir -p /var/tmp

  28. hwclock -u -s

  29. echo V > /dev/watchdog

  30. syslogd

  31. /etc/rc.d/init.d/netd start
  32. /usr/local/bin/sshd
  33. #/usr/boa/bin/boa
  34. sleep 1

  35. mount -t yaffs2 /dev/mtdblock0 /mnt/yaffs2

  36. ifconfig lo 127.0.0.1
  37. /etc/init.d/ifconfig-eth0
  38. #/etc/init.d/ifconfig-wlan0 rtl8188eu

  39. hwclock -s
  40. free_arp &
  41. #sysrst &

  42. #4gControl &
  43. #2gControl &
  44. cd /opt
  45. ./anytool >>/dev/null 2>&1 & # 后台运行,将错误信息重定向到null
复制代码

出0入36汤圆

 楼主| 发表于 2020-4-12 00:45:29 | 显示全部楼层
slzm40 发表于 2020-4-12 00:41
mdev命令在bin目录下?? 我的怎么在sbin下
我这个rcS和你差不多
如果不行,建议sleep1秒

我进去看看

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2020-4-12 00:49:53 | 显示全部楼层

  如果不行,没招,强制前期sleep一下吧.
在rsS调试下,在执行程之前,把/dev/下的列表全输出到日志文件. 看看是否节点真的建立了.
which指令可以查命令的路径.

出0入36汤圆

 楼主| 发表于 2020-4-12 00:53:43 | 显示全部楼层
/bin/mdev -s
sleep 2
./nuc980_jyz &

我在rcs里面这么写,还是不行。。。

出0入36汤圆

 楼主| 发表于 2020-4-12 01:08:26 来自手机 | 显示全部楼层
slzm40 发表于 2020-4-12 00:49
如果不行,没招,强制前期sleep一下吧.
在rsS调试下,在执行程之前,把/dev/下的列表全输出到日志文 ...

sleep貌似不好使……

出0入89汤圆

发表于 2020-4-12 01:13:50 来自手机 | 显示全部楼层
大神还没睡啊!

出0入0汤圆

发表于 2020-4-12 09:53:40 | 显示全部楼层

看不出啥问题      
但我有点问题请教一下,我在这种启动脚本里面基本没见过 用 ./app 的形式, 基本都是绝对路径。 你的应用程序在根目录,rcS脚本 应该不在根目录。这样能调用到么。  或者你可以在调用之前使用  cd /   试试。

出0入0汤圆

发表于 2020-4-12 10:18:35 来自手机 | 显示全部楼层
估计应用里有些文件路径不是绝对路径

出0入36汤圆

 楼主| 发表于 2020-4-12 10:27:34 来自手机 | 显示全部楼层
浮华一生 发表于 2020-4-12 09:53
看不出啥问题      
但我有点问题请教一下,我在这种启动脚本里面基本没见过 用 ./app 的形式,  ...

你说的对,我忽然想起来我以前在把文件放在rcs那个目录下的。

出0入36汤圆

 楼主| 发表于 2020-4-12 11:21:14 | 显示全部楼层
浮华一生 发表于 2020-4-12 09:53
看不出啥问题      
但我有点问题请教一下,我在这种启动脚本里面基本没见过 用 ./app 的形式,  ...

你看看我把程序拷贝到/etc/init.d/下面,和rcs同以位置,并且rcs里面加上绝对路径了,还是不行。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2020-4-12 11:34:57 | 显示全部楼层
redworlf007 发表于 2020-4-12 11:21
你看看我把程序拷贝到/etc/init.d/下面,和rcs同以位置,并且rcs里面加上绝对路径了,还是不行。 ...

前面不能有那个 "."            
用  /etc/init.d/nuc980_jyz &

加 . 的话表示当前目录

出0入36汤圆

 楼主| 发表于 2020-4-12 11:40:32 来自手机 | 显示全部楼层
浮华一生 发表于 2020-4-12 11:34
前面不能有那个 "."            
用  /etc/init.d/nuc980_jyz &


(⊙o⊙)…没注意,等等再试下。

出0入36汤圆

 楼主| 发表于 2020-4-12 11:41:50 来自手机 | 显示全部楼层
浮华一生 发表于 2020-4-12 11:34
前面不能有那个 "."            
用  /etc/init.d/nuc980_jyz &


我的应用程序就在当前目录下,我把文件拷贝到/etc/init.d下面的

出0入0汤圆

发表于 2020-4-12 11:55:25 | 显示全部楼层
redworlf007 发表于 2020-4-12 11:41
我的应用程序就在当前目录下,我把文件拷贝到/etc/init.d下面的

你如果在 /etc/init.d 下面 执行 ./etc/ini.d/nuc980_jyz  这就表示在 /etc/init.d 下面还有一个 etc/init.d 目录
那你的 nuc980_jyz 的绝对路径就是  /etc/init.d/etc/init.d/nuc980_jyz   可实际不是  所以不能有那个.     那个. 表示当前目录   你如果复制到当前了  就用 ./nuc980_jyz 了

出0入36汤圆

 楼主| 发表于 2020-4-12 16:49:34 | 显示全部楼层
浮华一生 发表于 2020-4-12 11:55
你如果在 /etc/init.d 下面 执行 ./etc/ini.d/nuc980_jyz  这就表示在 /etc/init.d 下面还有一个 etc/ini ...

我又试了下,/etc/init.d/nuc980_jyz & 这么写,还是打开串口错误。。。。我再查查代码,看看我的代码里面是不是哪里不对。。。

rcs里面直接写./nuc980_jyz &  启动后,说找不到这个文件。。。。


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2020-4-12 17:17:36 | 显示全部楼层
redworlf007 发表于 2020-4-12 16:49
我又试了下,/etc/init.d/nuc980_jyz & 这么写,还是打开串口错误。。。。我再查查代码,看看我的代码里 ...

楼主这是真功夫开上了!请教一哈!

1.  你去年咨询的这个SPIFLASH启动的问题,搞定了吗?https://www.amobbs.com/thread-5718533-1-1.html
2. 这个980整体ESD EMC 能过吗,跟972比咋样了?

出0入0汤圆

发表于 2020-4-12 17:33:35 | 显示全部楼层
redworlf007 发表于 2020-4-12 16:49
我又试了下,/etc/init.d/nuc980_jyz & 这么写,还是打开串口错误。。。。我再查查代码,看看我的代码里 ...

你可以在脚本里面试试:
cd /etc/init.d
./nuc980_jyz &

绝对路径的时候报的什么串口错误?

出0入36汤圆

 楼主| 发表于 2020-4-12 17:42:52 | 显示全部楼层
浮华一生 发表于 2020-4-12 17:33
你可以在脚本里面试试:
cd /etc/init.d
./nuc980_jyz &

报错还是最前面的那个,打开串口失败,我再检查我的代码,我把新塘的demo串口程序搞进去,自启动正常。。。

出0入0汤圆

发表于 2020-4-12 17:44:51 | 显示全部楼层
redworlf007 发表于 2020-4-12 17:42
报错还是最前面的那个,打开串口失败,我再检查我的代码,我把新塘的demo串口程序搞进去,自启动正常。。 ...

哦哦  有对照的话 那估计是代码哪里逻辑有点问题

出0入36汤圆

 楼主| 发表于 2020-4-12 17:52:30 | 显示全部楼层
kinsno 发表于 2020-4-12 17:17
楼主这是真功夫开上了!请教一哈!

1.  你去年咨询的这个SPIFLASH启动的问题,搞定了吗?https://www.am ...

加sd nand,存到东西 放到sd nand里面。

出0入36汤圆

 楼主| 发表于 2020-4-12 18:03:00 | 显示全部楼层
浮华一生 发表于 2020-4-12 17:44
哦哦  有对照的话 那估计是代码哪里逻辑有点问题

我查了下代码,
        //测试是否为终端设备
        if (0 == isatty(STDIN_FILENO))
        {
                printf("standard input is not a terminal device\n");
                return (FALSE);
        }

打开串口函数里面,到这里挂了。。。。


int UART0_Open(int fd, char *port)
{

        //fd = open(port, O_RDWR | O_NOCTTY | O_NDELAY);
        //fd = open(port, O_RDWR | O_NOCTTY);
        if ((fd = open(port, O_RDWR | O_NOCTTY)) < 0)
        {
                printf("open serial port %s fail \n ", port);
                printf("fd= %d\r\n",fd);
                return fd;
        }
        if (FALSE == fd)
        {
                perror("Can't Open Serial Port");
                return (FALSE);
        }
        //恢复串口为阻塞状态
        if (fcntl(fd, F_SETFL, 0) < 0)
        {
                printf("fcntl failed!\n");
                return (FALSE);
        }
        else
        {
                printf("fcntl=%d\n", fcntl(fd, F_SETFL, 0));
        }
        //测试是否为终端设备
        if (0 == isatty(STDIN_FILENO))
        {
                printf("standard input is not a terminal device\n");
                return (FALSE);
        }
        else
        {
                printf("isatty success!\n");
        }
        printf("fd->open=%d\n", fd);
        return fd;
}

出0入0汤圆

发表于 2020-4-12 18:11:29 来自手机 | 显示全部楼层
RCS里面的时候还没有控制台。

出0入36汤圆

 楼主| 发表于 2020-4-12 18:14:33 | 显示全部楼层
浮华一生 发表于 2020-4-12 17:44
哦哦  有对照的话 那估计是代码哪里逻辑有点问题

搞好,我把那一句屏蔽了,就好了。。。

出0入36汤圆

 楼主| 发表于 2020-4-12 18:15:25 | 显示全部楼层
mangocity 发表于 2020-4-12 18:11
RCS里面的时候还没有控制台。

        //测试是否为终端设备
        if (0 == isatty(STDIN_FILENO))
        {
                printf("standard input is not a terminal device\n");
                return (FALSE);
        }

你说的RCS里面的时候,还没有控制台,指的是这个?

出0入0汤圆

发表于 2020-4-12 18:23:27 | 显示全部楼层
redworlf007 发表于 2020-4-12 18:15
//测试是否为终端设备
        if (0 == isatty(STDIN_FILENO))
        {

是的。stdin, stdout, stderr 在这个阶段都没有的。所以 printf 也是不能用。

出0入36汤圆

 楼主| 发表于 2020-4-12 18:27:33 | 显示全部楼层
mangocity 发表于 2020-4-12 18:23
是的。stdin, stdout, stderr 在这个阶段都没有的。所以 printf 也是不能用。

        if (0 == isatty(STDIN_FILENO))
        {
                printf("standard input is not a terminal device\n");
                //return (FALSE);
        }

但是这里的这个printf有打印。

出0入0汤圆

发表于 2020-4-12 18:51:33 | 显示全部楼层
把你的nuc980_jyz 文件放在/bin文件夹下,然后启动脚本直接写nuc980_jyz &即可

出0入0汤圆

发表于 2020-4-15 12:44:35 | 显示全部楼层
{
sleep 10
./nuc980
}&
这个sleep 这样写

出0入36汤圆

 楼主| 发表于 2020-4-15 13:38:31 | 显示全部楼层

我找到问题了

  //测试是否为终端设备
        if (0 == isatty(STDIN_FILENO))
        {
                printf("standard input is not a terminal device\n");
                return (FALSE);
        }



串口打开的函数里面把这个屏蔽了。

出0入0汤圆

发表于 2020-4-15 18:04:48 来自手机 | 显示全部楼层
为啥是printf问题?? 这不科学。。

出0入36汤圆

 楼主| 发表于 2020-4-15 18:06:58 | 显示全部楼层
slzm40 发表于 2020-4-15 18:04
为啥是printf问题?? 这不科学。。

不是printf的问题呀,是串口打开失败了。

出0入0汤圆

发表于 2020-4-15 18:15:14 | 显示全部楼层
编译器不对把!
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-25 13:38

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表