nohup /export/yhdfs/daily_check_new/yhdfs/script/m...
Creado el: 11 de diciembre de 2025
Creado el: 11 de diciembre de 2025
nohup /export/yhdfs/daily_check_new/yhdfs/script/modules/check_syncdata_test.sh /data0/hadoop-2.7.3/loop_sync_test.conf > /data0/hadoop-2.7.3/loop_sync_test.log 2>&1 &
[1] 1281998
这个为什么报错,在哪里看
你看到的输出:
textnohup ... & [1] 1281998
并不是报错!
这只是 Linux shell 的正常提示:它告诉你后台任务的 作业号为 1,进程 PID 为 1281998。
因为你用了 nohup ... > log 2>&1 &
程序的标准输出和错误输出都被重定向到了:
/data0/hadoop-2.7.3/loop_sync_test.log
bashtail -f /data0/hadoop-2.7.3/loop_sync_test.log
你可以看到脚本是否执行正常、有无报错信息。
bashps -ef | grep 1281998
如果进程还存在,说明程序正在跑。
如果你没有正确重定向,nohup 会写到 nohup.out,但你已经重定向了,所以不会。
如果你怀疑脚本执行有问题,请把下面命令的内容贴出来,我帮你分析:
bashtail -n 50 /data0/hadoop-2.7.3/loop_sync_test.log
[1] 1281998 不是报错,只是后台任务启动成功的提示。
要看报错,直接检查日志文件即可。
需要的话可以把日志贴出来,我帮你定位问题!
nohup /export/yhdfs/daily_check_new/yhdfs/script/modules/check_syncdata_test.sh /data0/hadoop-2.7.3/loop_sync_test.conf > /data0/hadoop-2.7.3/loop_sync_test.log 2>&1
nohup: ignoring input
nohup: failed to run command '/export/yhdfs/daily_check_new/yhdfs/script/modules/check_syncdata_test.sh': Permission denied
nohup 能不能用bash直接执行?
你现在看到的是真正的报错:
nohup: failed to run command '/export/yhdfs/daily_check_new/yhdfs/script/modules/check_syncdata_test.sh': Permission denied
说明 脚本本身没有执行权限,与 nohup 无关。
当然可以!
只要脚本没有执行权限,你完全可以用 bash 来执行它,例如:
bashnohup bash /export/yhdfs/daily_check_new/yhdfs/script/modules/check_syncdata_test.sh \ /data0/hadoop-2.7.3/loop_sync_test.conf \ > /data0/hadoop-2.7.3/loop_sync_test.log 2>&1 &
这样就不需要脚本本身有执行权限了。
最常见原因:
检查:
bashls -l /export/yhdfs/daily_check_new/yhdfs/script/modules/check_syncdata_test.sh
如果不是 -rwxr-xr-x,说明没有执行权限。
解决:
bashchmod +x /export/yhdfs/daily_check_new/yhdfs/script/modules/check_syncdata_test.sh
如果父目录缺少执行权限,也会报 Permission denied:
bashls -ld /export/yhdfs/daily_check_new/yhdfs/script/modules
如果权限不足,给执行权限:
bashchmod +x /export/yhdfs/daily_check_new/yhdfs/script/modules
(具体是否能改要看你的权限)
| 问题 | 情况说明 | 解决方案 |
|---|---|---|
| 脚本无执行权限 | 最常见 | chmod +x script.sh 或用 bash script.sh |
| 目录无执行权限 | 偶尔出现 | chmod +x 目录(如有权限) |
脚本头部不正确(如 \r\n) | 也会导致无法执行 | 运行 dos2unix script.sh |
如果你不确定权限问题,运行以下命令把结果贴给我,我帮你分析:
bashls -l /export/yhdfs/daily_check_new/yhdfs/script/modules/check_syncdata_test.sh ls -ld /export/yhdfs/daily_check_new/yhdfs/script/modules
我可以马上告诉你具体哪里有问题。
[华东预发测试环境root@A06-R08-I193-194-A003280 /]nohup sh /export/yhdfs/daily_check_new/yhdfs/script/modules/check_syncdata_test.sh /data0/hadoop-2.7.3/loop_sync_test.conf > /data0/hadoop-2.7.3/loop_sync_test.log 2>&1 &
[1] 1289775
& ^C东预发测试环境root@A06-R08-I193-194-A003280 /]ps -ef | grep nohup sh /export/yhdfs/daily_check_new/yhdfs/script/modules/check_syncdata_test.sh /data0/hadoop-2.7.3/loop_sync_test.conf > /data0/hadoop-2.7.3/loop_sync_test.log 2>&1 &
[华东预发测试环境root@A06-R08-I193-194-A003280 /]^C
[华东预发测试环境root@A06-R08-I193-194-A003280 /]tail -n 100 /data0/hadoop-2.7.3/loop_sync_test.log
nohup: ignoring input
2025-12-11 10:35 sync test process log file is /data0/hadoop-2.7.3/sync/sync_test_2025_12_11_10_35_33
=============================== test env prepare ===============================
src server user group check success cost: 1 seconds.
dst server user group check success cost: 2 seconds.
mount src dir /data0/fs-vgauu8hxs6 success cost: 6 seconds
mount dst dir /data0/fs-vttak7w7nu success cost: 3 seconds
clean env success cost: 9 seconds. src count is [1 0 0 /synctest], dst count is [1 0 0 /synctest]
[华东预发测试环境root@A06-R08-I193-194-A003280 /]
我用这个启动以后,怎么ps 里面没有日志的显示?
你现在遇到的情况其实完全正常,不是错误。
我们一步步来解释你看到的现象。
你启动方式是:
bashnohup sh check_syncdata_test.sh conf > loop_sync_test.log 2>&1 &
这意味着:
👉 ps 永远不会显示日志内容,它只显示进程名与参数。
你看到的这个就是后台运行的脚本:
root 1289775 ... sh /export/.../check_syncdata_test.sh /data0/.../loop_sync_test.conf
这说明脚本 已经在运行。
你运行:
bashtail -n 100 /data0/hadoop-2.7.3/loop_sync_test.log
看到:
textnohup: ignoring input ... sync test process ... mount src dir ... mount dst dir ... clean env success ...
说明脚本执行到 “prepare 环境阶段”,日志输出全都进文件了。
这一切都正常。
你用 tail -n 100,这个只是看最后 100 行,不会跟随输出。
如果你想像控制台一样看到实时日志,需要用:
bashtail -f /data0/hadoop-2.7.3/loop_sync_test.log
这样日志追加一行你就看到一行。
日志停在:
clean env success cost: 9 seconds. ...
说明它已经准备环境成功,要么:
但只要进程还在(ps 显示存在),脚本就在运行。
方法:
bashtop -p 1289775
如果 CPU>0%,说明在干活。
bashwatch -n 1 "ls -l /data0/hadoop-2.7.3/loop_sync_test.log"
如果文件大小在变,说明脚本还在输出日志。
bashtail -f /data0/hadoop-2.7.3/loop_sync_test.log
| 现象 | 是否正常 | 原因 |
|---|---|---|
| ps 中看不到日志内容 | ✔ 正常 | ps 从不显示日志 |
| tail 看到日志但不更新 | ✔ 可能正常 | 只是 tail -n100,不是 tail -f |
| nohup 输出 “ignoring input” | ✔ 正常 | nohup 的固定提示 |
| 脚本进程存在 | ✔ 正常 | 已成功后台运行 |
请你执行下面两条命令,把输出贴给我:
textps -ef | grep 1289775 ls -l /data0/hadoop-2.7.3/loop_sync_test.log
我可以判断脚本卡在哪里、是否正常运行。
我的意思 日志重导向哪个文件,为什么不在ps里面显示?
明白你的意思了,你的疑问是:
既然我用了
> xxx.log重定向日志,为什么在ps -ef中看不到这个日志文件路径?
这是 Linux 的正常行为,不是你操作的问题。
ps 不会显示重定向到哪里,只显示启动时的命令行参数你启动命令是:
bashnohup sh check_syncdata_test.sh config > xxx.log 2>&1 &
在 ps -ef 中看到的是脚本的执行命令:
sh check_syncdata_test.sh config
但是你看不到:
nohup>xxx.log)2>&1&这是为什么?
流程如下:
bash 解析命令行> xxx.log 2>&1execve("sh", ["sh", "check_syncdata_test.sh"])也就是说:
> 和日志文件名无论你用:
textsh script.sh > log bash script.sh > log nohup script > log script > log
ps 都不会显示日志重定向路径。
因为 > 从来不是进程参数,而是 Shell 的操作符。
你自己的启动命令已经决定了日志位置:
... > /data0/hadoop-2.7.3/loop_sync_test.log 2>&1
即:
📌 日志一定在:
/data0/hadoop-2.7.3/loop_sync_test.log
ps 永远不会显示这个文件路径。
bashps -efww | grep scriptname
或
bashcat /proc/<PID>/cmdline
但即使如此,仍然看不到重定向部分,因为重定向根本不会传递给进程。
因为 > 重定向是在执行脚本之前由 shell 完成的,不属于脚本进程的参数,所以 ps 里永远不会显示日志文件路径。
如果你愿意,我还可以帮你写一个简单的工具脚本用来自动查看日志文件对应的进程。
ps 是什么? 是和 shell 强相关的吗?
ps 是 Linux/Unix 系统里的 进程查看命令(process status),它不是 Shell 的一部分,也不是针对 Shell 的功能,它是 操作系统级别 的命令。
但是 ——
你看到的效果 确实和 Shell 有关系,因为 Shell 会修改执行命令的方式,例如重定向、管道。
下面我把它讲清楚:
ps(process status)用于显示系统中的进程信息。
例如:
bashps -ef
会显示:
重要的是:
ps 显示的是进程认为它的命令行是什么。
这是来自 /proc/<pid>/cmdline,由内核保存。
例如:
bashsh script.sh > out.log
Shell 会做两件事:
执行后,进程看到的只有它的参数:
sh script.sh
重定向动作不会进入进程命令行,也不会被 ps 捕获。
因为:
它在进程启动之前就已经处理完毕。
进程(sh/script)根本不知道 stdout 被重定位到了哪里。
而 cmdline 里不包含 shell 的重定向符号。
所以你永远不会在 ps 里看到:
text> logfile 2>&1 | &
这些都是 Shell 操作符,不是进程执行参数。
| 组件 | 作用 |
|---|---|
| Shell(bash、sh、zsh) | 解析命令,处理 >, ` |
| ps | 查看已经运行的进程信息(内核中的数据) |
👉 两者没有直接依赖关系,但 Shell 的行为会影响最终启动的进程是怎样的。
因为日志重定向是 Shell 的操作,而 Shell 在启动进程前就完成了,没有留在进程参数中。
进程看到的是:
sh script.sh conf
你看到的命令中:
> logfile 2>&1 &
全部属于 shell 的功能,ps 无法显示。
ps 不是 shell 的一部分,它读的是操作系统记录的进程信息;
但 shell 在启动进程前会处理重定向,因此 ps 里永远看不到 “> logfile” 这样的重定向信息。
如果你想,我还能给你演示:
/proc/<pid>/fd 中看到它的日志输出被重定向到哪个文件需要的话告诉我,我可以继续讲。