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