我正在尝试直接从 Linux 内核运行我的应用程序(不使用 cron 或类似的东西)。我尝试过使用./init/init.c
,但它运行得太早:
$ dmesg
...
[ 0.605657] TEST!!!
...
我的想法是在用户成功登录后启动应用程序,但我找不到合适的功能来使用。
答案1
如果您在用户登录后确实需要它,您可以将其放入 shell 配置文件中。最有可能的~/.bash_profile
。
您想要添加一行(可能在末尾附近),它只是调用应用程序的文件名,就像您从终端运行它一样,例如:/home/username/bin/mypersonalscript.sh&
.您可能需要使用绝对路径。
另请务必在末尾添加 & 符号。这会将进程分叉到后台,如果没有它,您在登录时可能无法进入 shell。
如果它不起作用,请确保您的脚本可执行。
答案2
内核的工作是运行一个进程:在里面,它获取进程ID 1。init的工作是运行其他进程来提供系统服务并允许用户登录。
在其他一些情况下,Linux 内核也会执行进程。例如,当内核在某些总线上检测到新硬件时,它会执行modprobe
以将驱动程序加载为模块。另一个例子是可以配置一个程序来通过管道传输核心转储。我认为所有这些情况都使用call_usermodehelper_xxx
功能。
您会注意到,只有极少数情况,它们都是由内核事件触发的:硬件事件或程序终止。这些是特殊情况,保留用于低级系统功能。执行进程的正常方法是,它是从一个进程派生出来的,而该进程又是从一个进程派生出来的,而这个进程又是从 init 派生出来的。
内核甚至没有知道关于“成功登录”。登录是一个高级概念,远远高于内核。要在用户登录时以 root 身份运行进程,请将其添加到聚丙烯酰胺配置,与pam_exec
模块。要以登录用户身份运行进程,请将其添加到用户的 shell 启动文件中,通常为~/.profile
.