请教Linux上应用程序自启动的问题,谢谢。
本帖最后由 redworlf007 于 2020-4-11 18:36 编辑1、在Linux,有个串口通讯的程序,串口给读卡器发一次指令读卡器应答有没有卡片,并且把收到的串口应答打印在串口控制台,应用程序名:nuc980_jyz。
2、在串口控制台,命令行输入:./nuc980_jyz &,这样可以正常运行。
3、在Linux启动脚本rcS里面,添加:./nuc980_jyz &,重启后就报错,应用程序在根目录。
4、请教大家,这个啥原因啊。
启动脚本里写绝对路径 本帖最后由 dukelec 于 2020-4-11 19:57 编辑
啟動的太靠前,節點還沒建立?
另外,切後台可以考慮用 nohup,或者 screen 工具 tcm123 发表于 2020-4-11 18:36
启动脚本里写绝对路径
文件在根目录下,这个应该是绝对路径了吧。 dukelec 发表于 2020-4-11 19:55
啟動的太靠前,節點還沒建立?
另外,切後台可以考慮用 nohup,或者 screen 工具 ...
在启动脚本里面./nuc980_jyz 这么写,不加&,应用程序也能正常启动,加上&应用程序启动就报错…… 应该是fd指向的对象在脚本运行是还没有建立,基本上是串口驱动还没有加载。
没有用&可以的原因是在前台运行nuc980_jyz,程序应该会阻塞等待打开fd,而加了&会后台运行nuc980_jyz,程序在后台打开fd失败则会直接退出。
以上纯属猜测。 redworlf007 发表于 2020-4-11 21:25
在启动脚本里面./nuc980_jyz 这么写,不加&,应用程序也能正常启动,加上&应用程序启动就报错…… ...
不要前面那个 ".'" 直接 /app & 浮华一生 发表于 2020-4-11 22:08
不要前面那个 ".'" 直接 /app &
不行,试了。 Nuker 发表于 2020-4-11 22:00
应该是fd指向的对象在脚本运行是还没有建立,基本上是串口驱动还没有加载。
没有用&可以的原因是在前台运行 ...
我再检查下代码看看。 redworlf007 发表于 2020-4-11 22:14
不行,试了。
不介意把你的 rcS脚本发上来看看 浮华一生 发表于 2020-4-11 22:19
不介意把你的 rcS脚本发上来看看
明天我发,这会从公司回来了。 本帖最后由 slzm40 于 2020-4-12 00:09 编辑
redworlf007 发表于 2020-4-11 22:46
明天我发,这会从公司回来了。
节点未建立,
在之前要先执行/sbin/mdev -s 命令执行动态加载节点.
如果高级点的,可能是udev Nuker 发表于 2020-4-11 22:00
应该是fd指向的对象在脚本运行是还没有建立,基本上是串口驱动还没有加载。
没有用&可以的原因是在前台运行 ...
你说的对,我刚才又打印了下,加&,后台运行的时候:fd = UART0_Open(fd, "/dev/ttyS1"); //打开串口,返回文件描述符 这个fd返回-1,没有打开成功,手动运行这个会返回成功,这个怎么治疗?请教 slzm40 发表于 2020-4-12 00:07
节点未建立,
在之前要先执行/sbin/mdev -s 命令执行动态加载节点.
如果高级点的,可能是udev ...
我去看看。。。 sleep 10 浮华一生 发表于 2020-4-11 22:19
不介意把你的 rcS脚本发上来看看
你看看
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
slzm40 发表于 2020-4-12 00:41
mdev命令在bin目录下?? 我的怎么在sbin下
我这个rcS和你差不多
如果不行,建议sleep1秒
我进去看看 redworlf007 发表于 2020-4-12 00:45
我进去看看
{:lol:}如果不行,没招,强制前期sleep一下吧.
在rsS调试下,在执行程之前,把/dev/下的列表全输出到日志文件. 看看是否节点真的建立了.
which指令可以查命令的路径.
/bin/mdev -s
sleep 2
./nuc980_jyz &
我在rcs里面这么写,还是不行。。。 slzm40 发表于 2020-4-12 00:49
如果不行,没招,强制前期sleep一下吧.
在rsS调试下,在执行程之前,把/dev/下的列表全输出到日志文 ...
sleep貌似不好使…… 大神还没睡啊! redworlf007 发表于 2020-4-12 00:36
你看看
看不出啥问题 {:lol:}
但我有点问题请教一下,我在这种启动脚本里面基本没见过 用 ./app 的形式, 基本都是绝对路径。 你的应用程序在根目录,rcS脚本 应该不在根目录。这样能调用到么。或者你可以在调用之前使用cd / 试试。 {:lol:} 估计应用里有些文件路径不是绝对路径 浮华一生 发表于 2020-4-12 09:53
看不出啥问题
但我有点问题请教一下,我在这种启动脚本里面基本没见过 用 ./app 的形式,...
你说的对,我忽然想起来我以前在把文件放在rcs那个目录下的。 浮华一生 发表于 2020-4-12 09:53
看不出啥问题
但我有点问题请教一下,我在这种启动脚本里面基本没见过 用 ./app 的形式,...
你看看我把程序拷贝到/etc/init.d/下面,和rcs同以位置,并且rcs里面加上绝对路径了,还是不行。 redworlf007 发表于 2020-4-12 11:21
你看看我把程序拷贝到/etc/init.d/下面,和rcs同以位置,并且rcs里面加上绝对路径了,还是不行。 ...
前面不能有那个 "."
用/etc/init.d/nuc980_jyz &
加 . 的话表示当前目录 浮华一生 发表于 2020-4-12 11:34
前面不能有那个 "."
用/etc/init.d/nuc980_jyz &
(⊙o⊙)…没注意,等等再试下。 浮华一生 发表于 2020-4-12 11:34
前面不能有那个 "."
用/etc/init.d/nuc980_jyz &
我的应用程序就在当前目录下,我把文件拷贝到/etc/init.d下面的 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 了 浮华一生 发表于 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 &启动后,说找不到这个文件。。。。
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比咋样了? redworlf007 发表于 2020-4-12 16:49
我又试了下,/etc/init.d/nuc980_jyz & 这么写,还是打开串口错误。。。。我再查查代码,看看我的代码里 ...
你可以在脚本里面试试:
cd /etc/init.d
./nuc980_jyz &
绝对路径的时候报的什么串口错误? 浮华一生 发表于 2020-4-12 17:33
你可以在脚本里面试试:
cd /etc/init.d
./nuc980_jyz &
报错还是最前面的那个,打开串口失败,我再检查我的代码,我把新塘的demo串口程序搞进去,自启动正常。。。 redworlf007 发表于 2020-4-12 17:42
报错还是最前面的那个,打开串口失败,我再检查我的代码,我把新塘的demo串口程序搞进去,自启动正常。。 ...
哦哦有对照的话 那估计是代码哪里逻辑有点问题 kinsno 发表于 2020-4-12 17:17
楼主这是真功夫开上了!请教一哈!
1.你去年咨询的这个SPIFLASH启动的问题,搞定了吗?https://www.am ...
加sd nand,存到东西 放到sd nand里面。 浮华一生 发表于 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;
} RCS里面的时候还没有控制台。 浮华一生 发表于 2020-4-12 17:44
哦哦有对照的话 那估计是代码哪里逻辑有点问题
搞好,我把那一句屏蔽了,就好了。。。 mangocity 发表于 2020-4-12 18:11
RCS里面的时候还没有控制台。
//测试是否为终端设备
if (0 == isatty(STDIN_FILENO))
{
printf("standard input is not a terminal device\n");
return (FALSE);
}
你说的RCS里面的时候,还没有控制台,指的是这个? redworlf007 发表于 2020-4-12 18:15
//测试是否为终端设备
if (0 == isatty(STDIN_FILENO))
{
是的。stdin, stdout, stderr 在这个阶段都没有的。所以 printf 也是不能用。 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有打印。 把你的nuc980_jyz 文件放在/bin文件夹下,然后启动脚本直接写nuc980_jyz &即可 {
sleep 10
./nuc980
}&
这个sleep 这样写 日日♂夜夜 发表于 2020-4-15 12:44
{
sleep 10
./nuc980
我找到问题了
//测试是否为终端设备
if (0 == isatty(STDIN_FILENO))
{
printf("standard input is not a terminal device\n");
return (FALSE);
}
串口打开的函数里面把这个屏蔽了。 为啥是printf问题?? 这不科学。。 slzm40 发表于 2020-4-15 18:04
为啥是printf问题?? 这不科学。。
不是printf的问题呀,是串口打开失败了。 编译器不对把!
页:
[1]