redworlf007 发表于 2020-4-11 18:32:35

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

本帖最后由 redworlf007 于 2020-4-11 18:36 编辑

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

tcm123 发表于 2020-4-11 18:36:57

启动脚本里写绝对路径

dukelec 发表于 2020-4-11 19:55:20

本帖最后由 dukelec 于 2020-4-11 19:57 编辑

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

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

redworlf007 发表于 2020-4-11 20:11:08

tcm123 发表于 2020-4-11 18:36
启动脚本里写绝对路径

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

redworlf007 发表于 2020-4-11 21:25:46

dukelec 发表于 2020-4-11 19:55
啟動的太靠前,節點還沒建立?

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

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

Nuker 发表于 2020-4-11 22:00:00

应该是fd指向的对象在脚本运行是还没有建立,基本上是串口驱动还没有加载。
没有用&可以的原因是在前台运行nuc980_jyz,程序应该会阻塞等待打开fd,而加了&会后台运行nuc980_jyz,程序在后台打开fd失败则会直接退出。
以上纯属猜测。

浮华一生 发表于 2020-4-11 22:08:16

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

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

redworlf007 发表于 2020-4-11 22:14:45

浮华一生 发表于 2020-4-11 22:08
不要前面那个 ".'"    直接 /app &

不行,试了。

redworlf007 发表于 2020-4-11 22:15:15

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

我再检查下代码看看。

浮华一生 发表于 2020-4-11 22:19:51

redworlf007 发表于 2020-4-11 22:14
不行,试了。

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

redworlf007 发表于 2020-4-11 22:46:52

浮华一生 发表于 2020-4-11 22:19
不介意把你的 rcS脚本发上来看看

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

slzm40 发表于 2020-4-12 00:07:58

本帖最后由 slzm40 于 2020-4-12 00:09 编辑

redworlf007 发表于 2020-4-11 22:46
明天我发,这会从公司回来了。

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

redworlf007 发表于 2020-4-12 00:09:02

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

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

redworlf007 发表于 2020-4-12 00:12:47

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

我去看看。。。

RAMILE 发表于 2020-4-12 00:26:25

sleep 10      

redworlf007 发表于 2020-4-12 00:36:31

浮华一生 发表于 2020-4-11 22:19
不介意把你的 rcS脚本发上来看看

你看看

slzm40 发表于 2020-4-12 00:41:04

redworlf007 发表于 2020-4-12 00:36
你看看

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

#!/bin/sh


PATH=/sbin:/bin:/usr/sbin:/usr/bin
runlevel=S
prevlevel=N
umask 022
export PATH runlevel prevlevel

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

hostname -F /etc/sysconfig/HOSTNAME

mount -n -t proc none /proc
mount -n -t sysfs none /sys
mount -t ramfs none /dev

echo /sbin/mdev > /proc/sys/kernel/hotplug
/sbin/mdev -s
# mounting file system specified in /etc/fstab
mkdir -p /dev/pts
mkdir -p /dev/shm
mount -n -t devpts none /dev/pts -o mode=0622
mount -n -t tmpfs tmpfs /dev/shm
mount -n -t ramfs none /tmp
mount -n -t ramfs none /var
mkdir -p /var/empty
mkdir -p /var/log
mkdir -p /var/lock
mkdir -p /var/run
mkdir -p /var/tmp

hwclock -u -s

echo V > /dev/watchdog

syslogd

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

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

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

hwclock -s
free_arp &
#sysrst &

#4gControl &
#2gControl &
cd /opt
./anytool >>/dev/null 2>&1 & # 后台运行,将错误信息重定向到null

redworlf007 发表于 2020-4-12 00:45:29

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


我进去看看

slzm40 发表于 2020-4-12 00:49:53

redworlf007 发表于 2020-4-12 00:45
我进去看看

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

redworlf007 发表于 2020-4-12 00:53:43

/bin/mdev -s
sleep 2
./nuc980_jyz &

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

redworlf007 发表于 2020-4-12 01:08:26

slzm40 发表于 2020-4-12 00:49
如果不行,没招,强制前期sleep一下吧.
在rsS调试下,在执行程之前,把/dev/下的列表全输出到日志文 ...

sleep貌似不好使……

youkebing 发表于 2020-4-12 01:13:50

大神还没睡啊!

浮华一生 发表于 2020-4-12 09:53:40

redworlf007 发表于 2020-4-12 00:36
你看看

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

licheng0620 发表于 2020-4-12 10:18:35

估计应用里有些文件路径不是绝对路径

redworlf007 发表于 2020-4-12 10:27:34

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

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

redworlf007 发表于 2020-4-12 11:21:14

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

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

浮华一生 发表于 2020-4-12 11:34:57

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

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

加 . 的话表示当前目录

redworlf007 发表于 2020-4-12 11:40:32

浮华一生 发表于 2020-4-12 11:34
前面不能有那个 "."            
用/etc/init.d/nuc980_jyz &



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

redworlf007 发表于 2020-4-12 11:41:50

浮华一生 发表于 2020-4-12 11:34
前面不能有那个 "."            
用/etc/init.d/nuc980_jyz &



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

浮华一生 发表于 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 了

redworlf007 发表于 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 &启动后,说找不到这个文件。。。。


kinsno 发表于 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比咋样了?

浮华一生 发表于 2020-4-12 17:33:35

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

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

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

redworlf007 发表于 2020-4-12 17:42:52

浮华一生 发表于 2020-4-12 17:33
你可以在脚本里面试试:
cd /etc/init.d
./nuc980_jyz &


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

浮华一生 发表于 2020-4-12 17:44:51

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

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

redworlf007 发表于 2020-4-12 17:52:30

kinsno 发表于 2020-4-12 17:17
楼主这是真功夫开上了!请教一哈!

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

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

redworlf007 发表于 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;
}

mangocity 发表于 2020-4-12 18:11:29

RCS里面的时候还没有控制台。

redworlf007 发表于 2020-4-12 18:14:33

浮华一生 发表于 2020-4-12 17:44
哦哦有对照的话 那估计是代码哪里逻辑有点问题

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

redworlf007 发表于 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里面的时候,还没有控制台,指的是这个?

mangocity 发表于 2020-4-12 18:23:27

redworlf007 发表于 2020-4-12 18:15
//测试是否为终端设备
      if (0 == isatty(STDIN_FILENO))
      {


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

redworlf007 发表于 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有打印。

gujiamao_love 发表于 2020-4-12 18:51:33

把你的nuc980_jyz 文件放在/bin文件夹下,然后启动脚本直接写nuc980_jyz &即可

日日♂夜夜 发表于 2020-4-15 12:44:35

{
sleep 10
./nuc980
}&
这个sleep 这样写

redworlf007 发表于 2020-4-15 13:38:31

日日♂夜夜 发表于 2020-4-15 12:44
{
sleep 10
./nuc980


我找到问题了

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



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

slzm40 发表于 2020-4-15 18:04:48

为啥是printf问题?? 这不科学。。

redworlf007 发表于 2020-4-15 18:06:58

slzm40 发表于 2020-4-15 18:04
为啥是printf问题?? 这不科学。。

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

LingYi 发表于 2020-4-15 18:15:14

编译器不对把!
页: [1]
查看完整版本: 请教Linux上应用程序自启动的问题,谢谢。