Embedded linux 嵌入式linux应用程序启动脚本在命令行中工作得更好

Embedded linux 嵌入式linux应用程序启动脚本在命令行中工作得更好,embedded-linux,systemd,Embedded Linux,Systemd,我在Altera FPGA上运行嵌入式linux。它使用SystemD来运行startup,我在“multi-user.target.wants”部分有一个脚本来运行我的应用程序 当它从启动时运行时,我的代码运行速度比从ssh外壳运行相同脚本时慢 我已经检查了路径是否相同,脚本上的权限是否正确,脚本中是否使用了完整路径。使用“top”我可以看到,对于启动的不同线程,优先级设置是相同的,但不知何故,这两种启动方式的性能完全不同 全文如下: #!/bin/sh sleep 5s mount /dev

我在Altera FPGA上运行嵌入式linux。它使用SystemD来运行startup,我在“multi-user.target.wants”部分有一个脚本来运行我的应用程序

当它从启动时运行时,我的代码运行速度比从ssh外壳运行相同脚本时慢

我已经检查了路径是否相同,脚本上的权限是否正确,脚本中是否使用了完整路径。使用“top”我可以看到,对于启动的不同线程,优先级设置是相同的,但不知何故,这两种启动方式的性能完全不同

全文如下:

#!/bin/sh
sleep 5s
mount /dev/mmcblk0p5 /home/root/linux
cd /home/root/linux/mem_driver
./memdev_load
cd /home/root/linux/gpio_driver
insmod ./gpiodev.ko
mknod /dev/gpiodev c 249 0
sleep 5s
cd /home/root/src/control
mysqld_safe &
up=0
while [ $up -ne 2 ] 
do
    up=$(pgrep mysql | wc -l);
    echo $up
done
sleep 3s
cd /home/root/studio_web/myapp
npm start &
sleep 1s
cd /home/root/src/control
#sleep 1s
./control > /home/root/linux/output.log
插入了各种sleep命令,以尝试并确保事情按正确的顺序启动


如果您能帮助诊断此行为为何不同,我们将不胜感激。

这是您正在使用的唯一shell脚本吗?或者您是否有一个systemd服务文件来执行单个shell脚本

在这里使用
睡眠
是无效的。您应该将它们分离为单独的shell脚本,然后使用systemd确保shell脚本按顺序运行

例如,我们想先挂载目录,因为如果挂载失败,那么接下来的任何操作都不会成功。因此,我们创建了systemd装载服务:

# home-root-linux.mount
[Unit] 
Description=Mount /home/root/linux
Before=gpiodev.service

[Mount]
What=/dev/mmcblk0p5 
Where=/home/root/linux 
Options=defaults

[Install] 
WantedBy=multi-user.target
然后,我们可以在执行shell脚本的三个部分之前创建另一个systemd服务,这三个部分之前由
sleep
分隔,以确保它们按顺序运行

# gpiodev.service
[Unit]
Description=Handle gpiodev kernel module
After=home-root-linux.mount
Before=mysqlsafe.service

[Service]
Type=oneshot
ExecStartPre=/home/root/linux/mem_driver/memdev_load
ExecStart=/sbin/insmod gpiodev.ko; /bin/mknod /dev/gpiodev c 249 0
WorkingDirectory=/home/root/linux/gpio_driver
RemainAfterExit=yes
StandardOutput=journal

[Install]
WantedBy=multi-user.target
systemd服务的第二部分(在睡眠之后)。在本例中,我们有一个单独的shell脚本,它位于
/sbin/
中,因为它包含
while
循环,所以最好将其分开:

# mysqlsafe.service
[Unit]
Description=MySQL safe
After=gpiodev.service
Before=npmoutput.service

[Service]
Type=oneshot
ExecStart=/sbin/mysqlsafe.sh
WorkingDirectory=/home/root/src/control
RemainAfterExit=yes
StandardOutput=journal

[Install]
WantedBy=multi-user.target
在上面的systemd服务中执行的shell脚本的第二部分(由于复杂性而被分隔为单独的文件):

systemd服务的第三部分(原始shell脚本的第三部分,由
sleep
分隔):

这种方法背后的思想是systemd认识到每个服务的重要性以及对后续服务的依赖性,即,如果一个服务失败,队列中的后续服务将不会执行。然后,您可以使用
systemctl
检查此问题,并查看登录
journalctl

只需快速复制、粘贴和编辑。可能包含错误,因为未对其进行测试或检查


有关systemd服务文件的更多信息,请参见此处:

这是您正在使用的唯一shell脚本吗?或者您是否有一个systemd服务文件来执行单个shell脚本

在这里使用
睡眠
是无效的。您应该将它们分离为单独的shell脚本,然后使用systemd确保shell脚本按顺序运行

例如,我们想先挂载目录,因为如果挂载失败,那么接下来的任何操作都不会成功。因此,我们创建了systemd装载服务:

# home-root-linux.mount
[Unit] 
Description=Mount /home/root/linux
Before=gpiodev.service

[Mount]
What=/dev/mmcblk0p5 
Where=/home/root/linux 
Options=defaults

[Install] 
WantedBy=multi-user.target
然后,我们可以在执行shell脚本的三个部分之前创建另一个systemd服务,这三个部分之前由
sleep
分隔,以确保它们按顺序运行

# gpiodev.service
[Unit]
Description=Handle gpiodev kernel module
After=home-root-linux.mount
Before=mysqlsafe.service

[Service]
Type=oneshot
ExecStartPre=/home/root/linux/mem_driver/memdev_load
ExecStart=/sbin/insmod gpiodev.ko; /bin/mknod /dev/gpiodev c 249 0
WorkingDirectory=/home/root/linux/gpio_driver
RemainAfterExit=yes
StandardOutput=journal

[Install]
WantedBy=multi-user.target
systemd服务的第二部分(在睡眠之后)。在本例中,我们有一个单独的shell脚本,它位于
/sbin/
中,因为它包含
while
循环,所以最好将其分开:

# mysqlsafe.service
[Unit]
Description=MySQL safe
After=gpiodev.service
Before=npmoutput.service

[Service]
Type=oneshot
ExecStart=/sbin/mysqlsafe.sh
WorkingDirectory=/home/root/src/control
RemainAfterExit=yes
StandardOutput=journal

[Install]
WantedBy=multi-user.target
在上面的systemd服务中执行的shell脚本的第二部分(由于复杂性而被分隔为单独的文件):

systemd服务的第三部分(原始shell脚本的第三部分,由
sleep
分隔):

这种方法背后的思想是systemd认识到每个服务的重要性以及对后续服务的依赖性,即,如果一个服务失败,队列中的后续服务将不会执行。然后,您可以使用
systemctl
检查此问题,并查看登录
journalctl

只需快速复制、粘贴和编辑。可能包含错误,因为未对其进行测试或检查


有关systemd服务文件的更多信息,请参见此处:

谢谢Brendan-有几处输入错误,但似乎效果不错。了解了更多关于systemctl和systemd的知识。谢谢Brendan-有几个拼写错误,但似乎很有用。了解了更多有关systemctl和systemd的信息。